有没有任何方法可以在不使用属性去操作的情况下将AOP应用于.NET库

本文关键字:情况下 操作 AOP NET 应用于 属性 方法 任何 有没有 | 更新日期: 2023-09-27 18:21:06

我完全理解我的问题很奇怪,可能有很多更好的方法来实现我的目标,所以任何帮助都将不胜感激。

其基本思想是跟踪在运行时对某些类型实体的某些属性所做的所有更改,而不修改其代码。

假设我有一个名为Foo的实体,如下所述:

class Foo
{
    private string _bar;
    public string Bar 
    { 
        get { return _bar; } 
        set 
        {
            // some logic here...
            _bar = value;
            // some logic here... 
        }
    }
}

基本上,我想要一个库,它允许我编写如下代码:

Hook.For<Foo>()
    .OnSet(foo => foo.Bar)
    .Action((foo, value) => 
    {
        // save the state of the foo instance along with the value passed to the setter
    });

我知道所需的功能包括添加一些额外的构建步骤来修改输出程序集IL代码。语法不需要如此流畅,我甚至不介意JSON或XML配置。其主要思想是不要更改应用程序中大量糟糕的遗留代码,而是使用外部监控(用于调试目的)。

有没有任何AOP框架可以全局应用这样的方面,而不需要我用属性来装饰每个属性或类?

有没有任何方法可以在不使用属性去操作的情况下将AOP应用于.NET库

看起来PostSharp提供了在现有代码上应用外部方面的能力,如下文所述:http://programmersunlimited.wordpress.com/2011/07/27/applying-aspects-to-3rd-party-assemblies-using-postsharp/

我现在就采用这个解决方案。

您可能还想看看GitHub上的Tyler Brinks SNAP项目:https://github.com/TylerBrinks/Snap

该框架位于任何数量的IoC容器之上,以便在类之上注入AOP代理:

 // Configure SNAP to look at all assemblies starting with the "ConsoleApplication1"  namespace.
// Next, tell SNAP to intercept any code decorated with a DemoLoggingAttribute by running
// an instance of the DemoLoggingInterceptor class.
SnapConfiguration.For<StructureMapAspectContainer>(c =>
    {
        // Tell SNAP to only be concerned with stuff starting with this namespace.
        c.IncludeNamespace("ConsoleApplication1*");
        // Tell SNAP to intercept any method or class decorated with    "DemoLoggingAttribute"
        // by wrapping execution in your own DemoInterceptor class.
        c.Bind<DemoLoggingInterceptor>().To<DemoLoggingAttribute>();
    });
  // Configure StructureMap as usual.
  ObjectFactory.Configure(c => c.For<ISampleClass>().Use<SampleClass>());

 // Use your own class to handle interception.  Logging is a good example.
 public class DemoLoggingInterceptor : MethodInterceptor
 {
     public override void InterceptMethod(IInvocation invocation, MethodBase method, Attribute attribute)
     {
     // Log something important here.
     // Then continue executing your method.
     invocation.Proceed();
     }
 }