2. АОП
Аспектно-ориентированное программирование
– парадима программирования, основанная на
понятии сквозной функциональности, т.е.
служебной функциональности.
Если реализовывать сквозную
функциональность вместе с бизнес-логикой, то
код становится полнейшей гадостью.
3. Примеры сквозной функциольности:
• Логирование
• Обработка исключений
• Проверка прав доступа
• Проверка правильности аргументов
• Кеширование
4. Fody
Fody – это фреймворк для
внедрения сквозной
функциональности во время
компиляции.
Fody позволяет
манипулировать IL кодом
сборки.
5. Fody
В действительности Fody – это не совсем АОП.
Цель у них одна, но у Fody теоретических
возможностей больше, а практических
меньше.
Поскольку Fody сам по себе нам не интересен,
мы будем рассматривать его плагины.
6. Fody / лицензия
Fody распространяется под MIT License
Разрешено:
Не разрешено:
• Коммерческое
• Жаловаться
использование
на качество
• Изменение
• Распространение
Необходимо:
• Включать
копирайт
(если вы
собираетесь
расширять
Fody)
7. Fody / PropertyChanged
Облегчает жизнь при написании
классов, реализующих INotifyPropertyChanging.
Нету необходимости дергать event
PropertyChanged вручную -> снижается
количество кода на объявление свойств
8. Fody / PropertyChanged / Атрибуты
[ImplementPropertyChanged]
Вешается на класс и все свойства автоматически
начинают уведомлять о изменениях самих себя.
Все классы-наследники тоже начинают ввести себя
подобным образом.
Те свойства, которые уже уведомляли о изменениях не
будут уведомлять дважды.
10. Fody сам отслеживает дерево завимостей свойств.
Т.е. если меняется свойство FirstName и от него зависит свойство
FullName, то происходит автоматическое уведомление о
изменении обоих свойств.
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get { return this.FirstName + this.LastName; } }
11. Fody / PropertyChanged / Атрибуты
[DoNotNotify]
Вешается на свойство для того, чтобы Fody не пытался
уведомлять о его изменениях.
Типичное применение – для свойств, которые содержат какую-то
страшную кастомную логику
12. Fody / PropertyChanged / Атрибуты
[AlsoNotifyFor]
Вешается на свойство для того, чтобы уведомить о изменениях
другого свойства.
[AlsoNotifyFor(“FullName”)]
public string FirstName { get; set; }
public string FullName { get; set; }
13. Fody / PropertyChanged / Атрибуты
[DependsOn]
Вешается на свойство для того, чтобы происходили уведомления
о его изменении, при изменении других.
public string FirstName { get; set; }
[DependsOn(“FirstName”)]
public string FullName { get; set; }
14. On{PropertyName}Changed()
Если в классе есть есть метод с сигнатурой
подобной
void On{PropertyName}Changed()
, то при изменении свойства PropertyName будет
вызываться этот метод.
15. OnPropertyChanged()
Если в классе есть есть метод с сигнатурой
void OnPropertyChanged(
string name,
object before,
object after)
, то при изменении свойств будет вызываться этот
метод.
16. Fody / Ionad
Позволяет заменять статические вызовы одних
методов статическими вызовами других.
[StaticReplacement(typeof(DateTime))]
public static class DateTimeSubstitute
{
public static IDateTime Current { get; set; }
public static DateTime Now { get { return Current.Now; } }
}
public void SomeMethod()
{
var time = DateTime.Now;
// ...
}
=>
public void SomeMethod()
{
var time = DateTimeSubstitute.Now;
// ...
}
17. Fody / NullGuard
Автоматический выброс исключений, если входное
значение или выходное значение равно null.
Контроль осуществляется с помощью двух
атрибутов:
[NullGuard] – вешается на сборку или класс
[AllowNull] – вешается на аргумент, возвращаемое
значение или целое свойство
20. Fody / NullGuard / Замечания
Не рекомендуется его использовать на UI-шной
сборке.
Более адекватным видится использование в
DataAccess-слое и вью-моделях.
21. Fody / Equals
Занимается генерацией методов Equals(),
GetHashCode(), операторов сравнения и заставляет
класс реализовывать интерфейс IEquatable<T>.
22. Fody / Equals / Средства контроля
Атрибут [Equals] – вешается на класс, который должен
будет поддерживать сравнение.
При создании можно указать следующие параметры:
• bool DoNotAddEqualityOperators
• bool DoNotAddGetHashCode
• bool DoNotAddEquals
• TypeCheck (перечисление, которое содержит
возможности проверки типа (тот же тип; тот же или
наследник)
23. Fody / Equals / Средства контроля
Атрибут [IgnoreDuringEquals] – вешается на свойство,
которое нужно исключить из сравнения.
Атрибут [CustomEqualsInternal] – вешается на метод для
кастомной части сравнения. Этот метод должен
возвращать булево значение.
24. Fody / Equals / Средства контроля
Недоработка авторов плагина: [IgnoreDuringEquals]
исключает свойство из генерации хеш-кода и нет
возможности описать метод кастомного обсчета хеш-кода
25. Fody / MethodCache
Кеширование возвращаемых значений метода.
Что надо сделать:
1. В классе оставить свойство вида
private ICache Cache { get; set; }
2. В это свойство положить нашу реализацию кеша.
3. Навешать атрибут [Cache] на нужный метод.
26. Fody / MethodCache
Небольшой фейл разработчика.
Ключ для кеширования метода, принимающего два
параметра выглядит так:
string.Format("Namespace.Class.Add_{0}_{1}", new
object[] { a, b });
Т.е. параметры a и b должны реализовывать
хороший ToString() метод