我正在使用温莎城堡。我有一个Business类和一个Interceptor配置如下:
windsorContainer.Register(Component.For<IMyBusinessInterface>()
.ImplementedBy<MyBusinessClass>()
.Interceptors<MyInterceptorAttribute>()
.LifestyleTransient());
IMyBusinessInterface
和MyBusinessClass
位于项目Business
内。
MyInterceptorAttribute
位于项目Interceptors
内。
Business
项目引用了Interceptors
项目。
MyInterceptorAttribute
用作MyBusinessClass
[MyInterceptorAttribute]
public class MyBusinessClass
{
public IUnitOfWork uow { get; set; }
public MyBusinessClass(IUnitOfWork uow)
{
uow = uow;
}
[MyInterceptorAttribute]
public MyReturnValue MyBusinessMethod(MyArguments arguments)
{
//...
}
}
我需要在MyInterceptorAttribute
类内传递(或检索)在Windsor Castle容器内已经实现的unit of work
的同一个实例。
在这一刻,我通过两个不同的实例。
我无法在MyInterceptorAttribute
内检索工作单元的实例,因为要获取invocation.InvocationTarget,我会创建一个循环引用。
public class MyInterceptorAttribute : IInterceptor
{
public void Intercept(IInvocation invocation)
{
IMyBusinessInterface obj = invocation.InvocationTarget as MyBusinessClass; //I cannot do this because of circular reference
//obj.uow = ..
}
}
所以我想在MyInterceptorAttribute
中添加一个工作单元的公共属性,并通过依赖注入得到业务类工作单元的相同实例......这样的事情:
public class MyInterceptorAttribute : IInterceptor
{
public IUnitOfWork uow { get; set; }
public void Intercept(IInvocation invocation)
{
//uow...
}
}
但是在这一刻我得到了两个不同的例子。是否可以修改相同的实例,例如windsor caste的配置......我想使用DependsOn
或DynamicParameters
或类似的东西?
谢谢
答案 0 :(得分:0)
不是将拦截器实现为由.Net运行时实例化的属性,因此不能用于Windsor的依赖注入,而是尝试使用标准的[Interceptor(typeof(MyInterceptor))]
属性。
然后,你可以在温莎注册MyInterceptor
你想要的任何生活方式,工作单位的依赖注入,或任何其他依赖,将按预期工作。