我知道Castle Windsor,您可以使用代码而不是将属性应用于类来注册方面(当使用Windsor中的方法拦截作为AOP时)。在Postsharp中是否可以相同?这是一个偏好的东西,但更喜欢将方面与接口/对象匹配在一个地方,而不是全部属性。
更新 好奇,如果我可以为与此类似的接口/对象分配方面:
container.Register(
Component
.For<IService>()
.ImplementedBy<Service>()
.Interceptors(InterceptorReference.ForType<LoggingAspect>()).Anywhere
);
如果你可以这样做,你可以选择不必在程序集/类/方法上放置属性来应用方面。然后我可以有一个代码文件/类,其中包含哪些方面应用于哪个类/方法/等。
答案 0 :(得分:3)
是。您可以使用多播(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 :(得分:1)
看一下LOOM.NET,你有一个后期编译器和一个运行时编织器。使用后者,您可以准确归档所需内容。
答案 2 :(得分:0)
应该可以使用PostSharp XML configuration。 XML配置是项目加载器中插件和项目模型的统一。
可以在http://www.sharpcrafters.com/blog/post/Configuring-PostSharp-Diagnostics-Toolkits.aspx找到.psproj的说明。
请注意,我只看过PostSharp Toolkits如何使用此XML配置的示例。 但它应该以相同的方式适用于自定义方面。
警告:我注意到从Nuget安装PostSharp Toolkit会覆盖现有的psproj文件。所以不要忘记备份它。