2010-02-24 69 views
1

我遇到了一些问题。我在Castle Windsor国际奥委会集装箱工作。现在我想要做的只是混淆一些AOP原则,而我特别想要做的是基于方法名称执行一些日志记录。我一直在看拦截器,目前我正在使用IInterceptor接口实现作为一个类来使用方面来执行此日志记录。问题是,如果我想执行特定的方法日志记录,然后它变得混乱,因为我需要把我的执行方面,以检查方法名称等一些逻辑...温莎集装箱城堡动态代理

我读过,你可以做所有这些都使用Dynamic Proxies和IInterceptorSelector接口以及IProxyGenerationHook接口。我已经在网上看到了一些这样做的例子,但我很困惑这是如何适应温莎的容器。我的意思是我使用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错误:密新类型TestClassProxy实现IProxyTargetAccessor这是一个DynamicProxy基础设施的接口,你应该永远不会实现它自己你是想在现有的代理混?”}

我知道我以错误的方式使用代理服务器,但是因为我还没有看到如何在windsor容器中使用代理服务器的具体示例,这有点令人困惑。

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

+0

澄清当我说如何使用动态代理与温莎容器我的意思是我将如何创建一个动态代理与我的配置上面的工作或动态代理工作完全不同,我已经得到了一切错误? 谢谢 – Iffy 2010-02-24 13:00:55

+0

您的ExceptionCatchAspect已经是一个DynamicProxy拦截器 – 2010-02-24 13:11:58

+0

哦,所以我使用动态代理甚至没有意识到它。这只是我见过的例子,其中动态代理对象实际上是创建的,并且intercepters注入到它中。在那种情况下,我将如何执行我的代码中的方法特定方面。我的意思是我认为这是通过使用IInterceptorSelector和IProxyGenerationHook接口,但从我看到你需要创建一个动态代理的新实例,我不明白这是如何绑回到windsor容器。 谢谢 – Iffy 2010-02-24 13:51:38

回答

3

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

I just added a website about Windsor AOP to documentation wiki。目前还没有太多,但我(和Mauricio;))会把你需要的所有信息放在那里。看一看,让我们知道一切是否清楚,以及是否缺少某些东西。

+0

谢谢你。 我不确定我是否正确地做了这件事,但是我首先声明了一个新的代理,并将它设置为与我的测试类一起使用,方法是将它添加到Proxy.MixIns(..)方法中。 现在类注册成功,但当我尝试从容器中解决它,我得到一个错误,如图所示: {“这是一个DynamicProxy2错误:Mixin类型TestClassProxy实现IProxyTargetAccessor这是一个DynamicProxy基础结构接口,你永远不应该实现它你自己。你是否想要混合现有的代理?“} 我如何附加一个新的代理类注册? – Iffy 2010-02-25 14:45:04

+0

好吧,我看到异常错误几乎说明了一切,不是吗? 您的服务是代理。通过将其标记为具有混合,拦截器等优点,您可以将其作为代理。所以你不要将现有的代理混合到你想要代理的组件中,因为这样你最终会遇到这个错误。这是否清楚?让我看看代码。 – 2010-02-25 15:01:39

+0

嗨, 我已经提出了我的问题,包括最简单的代码,我已经剥离了所有其他注册的东西,只剩下一个类,我试图附加代理。由于某种原因,这个代理服务器真的让我感到困惑。 非常感谢。 Iffy – Iffy 2010-02-25 15:15:02