我有一点问题。我在 Castle Windsor IOC Container 工作。现在我想做的只是弄乱一些 AOP 原则,而我特别想做的是基于方法名称执行一些日志记录。我一直在研究拦截器,目前我正在使用作为类实现的 IInterceptor 接口来使用方面执行此日志记录。问题是,如果我想在特定方法上执行日志记录,那么它会变得一团糟,因为我需要将一些逻辑放入我实现的方面以检查方法名称等......
我读过你可以使用动态代理和 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 基础结构接口,您永远不应该自己实现它。您是否尝试混合现有代理?”}
我知道我以错误的方式使用代理,但由于我没有看到任何关于如何将代理与温莎容器一起使用的具体示例,这有点令人困惑。
我的意思是,如果我想使用 LoggingProxyGenerationHook,它只是告诉拦截器首先使用以“check”开头的方法,那么这是正确的方法还是我完全走错了路。我刚刚采用代理方式,因为它看起来非常强大,我想了解如何使用这些代理进行未来的编程工作。