инструмент очень полезный. но думаю было б лучше если б рассмотрели на примере поживее — например разграничение прав доступа или управление транзакциями к базе.
Так вы же IL меняете, сразу как у себя приложение собираете. Поэтому они будут работать так же, как если бы вы руками писали каждый раз Trace.WriteLine(«blah-blah»). Если с АОП не будет работать,, то и без него тоже.
Или я что-то не так понял?
Насколько я помню, для четвертого фреймворка постшарп уже только платный, по крайней мере для коммерческих приложений. Да и время сборки он заметно увеличивает. То есть инструмент интересный, но как и все — не без ограничений
Почти во всех популярных IoC/DI — фреймворках есть поддержка АОП. Например, в Spring.net и Castle.
Время сборки увеличено не будет, только время первого старта приложения. Причем, никакие левые атрибуты вешать не придется, код будет чистым poco. А тулзы типа PostSharp — это для энтузиастов.
Собственно поэтому я и юзаю Spring.Aop из Spring.Net, но и у него есть тоже пара недостатков в сравнении с PostSharp, связанные как раз с тем, что там аспекты навешиваются не в CompileTime, а в RunTime через генерацию динамических проксиков:
1. Нельзя просто создавать объекты через конструктор, так как тогда они не будут обернуты в динамические проксики с аспектами. Но это совсем не проблема, если все создается через IoC.
2. Если через Introduction Advice (в терминах Spring.Aop) добавлять к классу реализацию какого-то интерфейса, например INotifyPropertyChanged, то внутри самого класса нельзя сказать (INotifyPropertyChanged)this, так как понятно, что this — это ссылка на сам объект, а не его проксик с аспектами, и сам объект это интерфейс не реализует. Пару раз нарывался.
3. Забыл уже конкретику, но была проблема с биндингами WPF на объект, обернутый в проксик с аспектами, связанный с особенностью реализации Weak Events в биндингах WPF. Проблема решаемая, но очень неочевидная и в свое время пришлось ковырять исходники .Net, чтобы с ней разобраться.
У АОП через проксики есть и плюсы — например, можно на лету делать подмену таргета (объекта, который оборачивается в проксик). Через это, например, делается ленивая загрузка свойств в NHibernate, при этом исходный объекто остается POCO.
мне кажется, что логирование это динамическая штука, т.е. в зависимости от контекста ее нужно включать или выключать. а PostSharp вынуждает прямо в исходниках низкоуровневых классов вставлять атрибуты?
а если не хочется менять исходники или их нет?
не является ли dynamic proxy более подходящим инструментом для данного типа задач? ведь он требует менять только контекст, а не низкоуровневые классы?
Аспектно-ориентированное программирование. PostSharp