如何在WinForms中为方法添加方面?

时间:2014-05-01 16:20:14

标签: c# winforms aop autofac castle-dynamicproxy

我继承了一个用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. 将此Aspect代码手动添加到每个方法(更糟糕的解决方案)
  3. 当然,一旦我们重构了lagacy代码,我们就会正确行事。但现在怎么办? 也许有人有任何想法?

1 个答案:

答案 0 :(得分:1)

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

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