Позвольте мне сначала ответить Максу: действительно, аспекты не являются альтернативой хорошим шаблонам ООП. Они являются дополнением . Любой хороший дизайн АОП начинается с хорошего дизайна ООП. Но ООП-шаблоны иногда вынуждают вас писать много кода вручную. В этих случаях аспекты могут использоваться для автоматизации реализации шаблона ООП, не для их замены.
Когда вы пользуетесь AOP с умом, ваше решение может стать проще для понимания (бизнес-код не смешивается с кодом обслуживания), для тестирования (вы можете протестировать аспект независимо от бизнес-кода, т.е. вам не нужно тестировать что-либо бизнес-метод отслеживает правильно), измените (вам просто нужно изменить аспект, когда вы хотите изменить шаблон, вместо того, чтобы менять каждую реализацию шаблона). Теперь, если вы злоупотребляете AOP, если вы используете его в качестве инструмента хакерства, если вы не мыслите с точки зрения шаблонов ООП раньше, то вы получите больше затрат, чем пользы от AOP. Как любой острый инструмент, АОП следует использовать с умом.
Вернуться к исходному вопросу.
Кто сказал, что вы должны помещать аспекты в AssemblyInfo.cs? Вы можете создать новый файл с именем GlobalAspect.cs и поместить туда все аспекты уровня сборки. Вы правы, что AssemblyInfo.cs должен использоваться только для метаданных уровня сборки.
Но, как и вы, мне не нравятся аспекты на уровне сборки. Я думаю, что следует избегать. Основная проблема с аспектами на уровне сборки заключается в том, что они полагаются на соглашения об именах, и это зло. (Это зло называется хрупкость pointcut в академическом сообществе AOSD.) Действительно, когда вы переименовываете класс или пространство имен, вы меняете набор методов, к которым применяется аспект, и это может быстро стать кошмаром. Вот почему я никогда не использую для себя аспекты, основанные на соглашениях об именах.
А как насчет читаемости кода? Я думаю, что читаемый код в значительной степени является коротким кодом. Если у меня есть бизнес-метод CreateProduct, я, вероятно, хочу увидеть только код, создающий продукт. Большую часть времени меня не интересует код, который обрабатывает транзакции, исключения или трассировку. Достаточно, если я знаю, что некоторые аспекты справляются с этим для меня.
А откуда я знаю? С PostSharp у вас есть расширение Visual Studio. С AspectJ у вас есть плагин AspectJ для Eclipse (AJDT). В IDE они показывают, какие аспекты применяются к коду, который вы видите в данный момент. И если вы действительно хотите видеть детали (но вы редко этого хотите), вы можете использовать отладчик для перехода к аспектам или использовать Reflector для просмотра созданного кода.
Резюме:
- Хороший дизайн АОП всегда начинается с хорошего дизайна ООП.
- Избегайте использования соглашений об именах для применения аспектов.
- Используйте расширение PostSharp для Visual Studio или AJDT для визуализации аспектов в вашем коде.