Можете ли вы применить аспекты в PostSharp без использования атрибутов? - PullRequest
6 голосов
/ 17 октября 2011

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 17 октября 2011

Да.Вы можете использовать многоадресную рассылку (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 голос
/ 10 июня 2012

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

0 голосов
/ 14 декабря 2012

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

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

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

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

...