如何在WinForms中向方法添加方面

本文关键字:方法 添加 方面 WinForms | 更新日期: 2023-09-27 18:01:03

我继承了一个用WinForms编写的大型项目,在那里我必须进行很多小的更改。我想使用AOP(Castle.DynamicProxy和Autofac(,到目前为止还没有给我带来任何问题。我写了一个简单的方面:

class TestAspect : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine("Satrt method" + invocation.Method.Name);
        invocation.Proceed();
        Console.WriteLine("Stop funkcji " + invocation.Method.Name);
    }
}

接下来,我在ContainerBuilder中注册类型。例如:

builder.RegisterType<SomeClass>().As<ISome>().EnableInterfaceInterceptors().InterceptedBy(typeof(TestAspect)); 
builder.RegisterType<TestAspect>();

到目前为止,一切都很好。但我必须将这一方面添加到遗留代码中(编写得不好(。我不得不将方面代码(不仅仅是上面的代码(明确地添加到WinForms中。例如,我有一个启动CalculateSomething方法的按钮(在当前窗口中,不在类中(。在ContainerBuilder中,我注册当前表单:

builder.RegisterType<Form1>().EnableClassInterceptors().InterceptedBy(typeof(TestAspect));

但EnableClassInterceptors((仅适用于虚拟方法我知道旧代码需要重构,但客户已经使用了这个程序。我们重写了这段代码,但我们需要快速进行一些更改。我有两个解决方案:

  1. 将所有方法设为虚拟(非常糟糕的解决方案(
  2. 手动将此特性代码添加到每个方法(甚至更糟糕的解决方案(

当然,一旦我们重构了lagacy代码,我们就做对了。但现在该怎么办?也许有人知道?

如何在WinForms中向方法添加方面

Castle DynamicProxy受到.NET多态性特性的限制。这意味着要么是接口代理,它实际上是实现类的装饰器,要么是类代理,它将实现类子类化并覆盖虚拟方法。

另一种选择是某种编译后的IL编织,将行为添加到IL中。这最终看起来像你的第二个建议,只是它是由程序而不是程序员完成的。调查http://www.postsharp.net/