温莎集装箱中的城堡动态代理

时间:2010-02-24 12:42:17

标签: castle-windsor aop castle-dynamicproxy dynamic-proxy

我有点问题。我在Castle Windsor IOC Container工作。现在我想要做的只是搞乱一些AOP原则,我特别想做的是基于方法名称执行一些日志记录。我一直在寻找拦截器,目前我正在使用IInterceptor接口实现为类来使用方面执行此日志记录。问题是,如果我想对特定方法执行日志记录,那么它会变得混乱,因为我需要在我的实现方面添加一些逻辑来检查方法名称等...

我已经读过您可以使用Dynamic Proxies和IInterceptorSelector接口以及IProxyGenerationHook接口完成所有这些操作。我已经在网上看到了一些这样的例子,但我很困惑这一切是如何融入Windsor容器的。我的意思是我正在使用windsor容器,在我的代码中实际上是对IWindsorContainer接口的引用来创建我的所有对象。我的所有配置都是用代码而不是XML完成的。

首先,除了我目前正在进行的方式之外,有人知道在windsor容器中执行方法特定AOP的方法。

其次,如何在windsor容器中使用动态代理?

下面我添加了代码,我在创建代理并注册我的课程 拦截器

ProxyGenerator _generator = new ProxyGenerator(new PersistentProxyBuilder());
IInterceptorSelector _selector = new CheckLoggingSelector();
var loggingAspect = new LoggingAspect();
var options = new ProxyGenerationOptions(new LoggingProxyGenerationHook()) 
                  { Selector = _selector };
var proxy = _generator.CreateClassProxy(typeof(TestClass), options, loggingAspect);
TestClass testProxy = proxy as TestClass;

windsorContainer.Register(
Component.For<LoggingAspect>(),
Component.For<CheckLoggingAspect>(),
Component.For<ExceptionCatchAspect>(),
Component.For<ITestClass>()
    .ImplementedBy<TestClass>()
    .Named("ATestClass")
    .Parameters(Parameter.ForKey("Name").Eq("Testing"))
    .Proxy.MixIns(testProxy));

测试类如下:

public class TestClass : ITestClass
{
    public TestClass()
    {

    }        

    public string Name
    {
        get;
        set;
    }
    public void Checkin()
    {
        Name = "Checked In";
    }
}

对于拦截器,它们非常简单,如果名称以Check开头,则只需输入一个方法。

现在,当我从容器中解析我的TestClass时,我收到错误。

{“这是一个DynamicProxy2错误:Mixin类型TestClassProxy实现了IProxyTargetAccessor,这是一个DynamicProxy基础结构接口,你永远不应该自己实现它。你想尝试混合现有的代理吗?”}

我知道我正在以错误的方式使用代理,但由于我没有看到如何使用代理与windsor容器的任何具体示例,这有点令人困惑。

我的意思是,如果我想使用LoggingProxyGenerationHook,它只是告诉拦截器首先找到以“check”开头的方法,那么这是正确的方法,或者我完全在错误的路径上。我只是采用代理方式,因为它似乎非常强大,我想了解如何使用这些代理进行未来的编程工作。

1 个答案:

答案 0 :(得分:3)

使用.Interceptors()您已使用动态代理。当组件具有指定的拦截器时,Windsor将为其创建代理,并为其使用这些拦截器。您还可以使用方法.SelectedWith.Proxy属性设置您在DynamicProxy中已知的其他选项。

I just added a website about Windsor AOP to documentation wiki。那里还没有多少,但我(和Mauricio;))会把你需要的所有信息都放在那里。看看,如果一切都清楚,如果有什么东西丢失,请告诉我们。