我有点问题。我在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”开头的方法,那么这是正确的方法,或者我完全在错误的路径上。我只是采用代理方式,因为它似乎非常强大,我想了解如何使用这些代理进行未来的编程工作。
答案 0 :(得分:3)
使用.Interceptors()
您已使用动态代理。当组件具有指定的拦截器时,Windsor将为其创建代理,并为其使用这些拦截器。您还可以使用方法.SelectedWith
和.Proxy
属性设置您在DynamicProxy中已知的其他选项。
I just added a website about Windsor AOP to documentation wiki。那里还没有多少,但我(和Mauricio;))会把你需要的所有信息都放在那里。看看,如果一切都清楚,如果有什么东西丢失,请告诉我们。