#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. Поэтому не забудьте создать резервную копию.