Можете ли вы применить аспекты в PostSharp без использования атрибутов?

#aop #postsharp

#aop #postsharp

Вопрос:

Я знаю, что в Castle Windsor вы можете зарегистрировать аспекты (при использовании перехвата методов в Windsor в качестве AOP) с помощью кода вместо применения атрибутов к классам. Возможно ли то же самое в Postsharp? Это предпочтительная вещь, но я предпочитаю, чтобы аспекты соответствовали интерфейсам / объектам в одном месте, в отличие от атрибутов повсюду.

Обновление: Интересно, могу ли я назначить аспекты интерфейсам / объектам, подобным этому:

 container.Register(
        Component
        .For<IService>()
        .ImplementedBy<Service>()
        .Interceptors(InterceptorReference.ForType<LoggingAspect>()).Anywhere
   );
  

Если бы вы могли это сделать, у вас была бы возможность НЕ размещать атрибуты в сборках / классе / методах для применения аспектов. Тогда у меня может быть один файл кода / класс, который содержит, какие аспекты применяются к какому классу / методам / и т.д.

Ответ №1:

ДА. Вы можете либо использовать многоадресную рассылку (http://www.sharpcrafters.com/blog/post/Day-2-Applying-Aspects-with-Multicasting-Part-1.aspx http://www.sharpcrafters.com/blog/post/Day-3-Applying-Aspects-with-Multicasting-Part-2.aspx ) или вы можете использовать поставщиков аспектов (http://www.sharpcrafters.com/blog/post/PostSharp-Principals-Day-12-e28093-Aspect-Providers-e28093-Part-1.aspx , http://www.sharpcrafters.com/blog/post/PostSharp-Principals-Day-13-e28093-Aspect-Providers-e28093-Part-2.aspx ).

Пример:

     using System;
    using PostSharp.Aspects;
    using PostSharp.Extensibility;

    [assembly: PostSharpInterfaceTest.MyAspect(AttributeTargetTypes = "PostSharpInterfaceTest.Interface1", AttributeInheritance = MulticastInheritance.Multicast)]

    namespace PostSharpInterfaceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Example e = new Example();
            Example2 e2 = new Example2();
            e.DoSomething();
            e2.DoSomething();
            Console.ReadKey();
        }
    }

    class Example : Interface1
    {

        public void DoSomething()
        {
            Console.WriteLine("Doing something");
        }
    }

    class Example2 : Interface1
    {

        public void DoSomething()
        {
            Console.WriteLine("Doing something else");
        }
    }

    interface Interface1
    {
        void DoSomething();
    }

    [Serializable]
    class MyAspect : OnMethodBoundaryAspect
    {
        public override void OnEntry(MethodExecutionArgs args)
        {
            Console.WriteLine("Entered "   args.Method.Name);
        }
    }
}
  

Я рекомендую, если у вас есть сложные требования для определения того, какие типы получают определенные аспекты, рассмотреть возможность создания поставщика аспектов вместо этого.

Комментарии:

1. Эти статьи, похоже, все еще применяют атрибут к классу. Я смотрел на то, как Castle выполняет динамическую инъекцию: blog.andreloker.de/post/2009/02/20 /… . Мне просто интересно, можете ли вы сделать это с помощью PostSharp. Поскольку PostSharp использует их аспекты во время компиляции, можно понять, если это не так.

2. Чего вы хотите достичь? В вашем вопросе говорится: «Это вещи предпочтения, но я предпочитаю, чтобы аспекты соответствовали интерфейсам / объектам в одном месте, в отличие от атрибутов повсюду». именно поэтому я дал ответы, которые я сделал. Теперь это звучит так, как будто вы хотите включить или отключить аспекты во время выполнения. Какое это имеет значение, если аспекты применяются с использованием атрибутов? У вас есть проблемы со временем выполнения и временем компиляции?

3. Мой ответ все тот же. Я обновил, чтобы дать вам пример того, что делать.

4. @Bless нет удобного интерфейса для применения aspcets, но вы, безусловно, могли бы довольно легко создать его самостоятельно, а затем, используя поставщика аспектов, вы могли бы применить аспекты на основе того, что было настроено. Вы можете сохранить все объявления многоадресной рассылки в одном файле, таком как «AspectApplication.cs»

5. Хорошо. Думаю, мне нужно прочитать вашу серию. Спасибо за ваше терпение.

Ответ №2:

Взгляните на LOOM.NET там у вас есть post-компилятор и runtime weaver. С более поздней версией вы можете архивировать именно то, что хотите.

Ответ №3:

Должна быть возможность использовать конфигурацию PostSharp XML. Конфигурация XML — это объединение моделей подключаемого модуля и проекта в загрузчике проекта.

Описание .psproj можно найти по адресуhttp://www.sharpcrafters.com/blog/post/Configuring-PostSharp-Diagnostics-Toolkits.aspx.

Обратите внимание, что я видел только примеры того, как наборы инструментов PostSharp используют эту конфигурацию XML. Но это должно работать для пользовательских аспектов таким же образом.

Предупреждение: Я заметил, что установка инструментария PostSharp из Nuget перезаписывает существующий файл psproj. Поэтому не забудьте создать резервную копию.