使用Windsor Castle自定义IDependencyResolver中的延迟初始化

时间:2017-04-14 10:14:57

标签: c# arguments castle-windsor interceptor

我正在使用温莎城堡。我有一个Business类和一个Interceptor配置如下:

windsorContainer.Register(Component.For<IMyBusinessInterface>()
    .ImplementedBy<MyBusinessClass>()
    .Interceptors<MyInterceptorAttribute>()
    .LifestyleTransient());

IMyBusinessInterfaceMyBusinessClass位于项目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的配置......我想使用DependsOnDynamicParameters或类似的东西?

谢谢

1 个答案:

答案 0 :(得分:0)

不是将拦截器实现为由.Net运行时实例化的属性,因此不能用于Windsor的依赖注入,而是尝试使用标准的[Interceptor(typeof(MyInterceptor))]属性。

然后,你可以在温莎注册MyInterceptor你想要的任何生活方式,工作单位的依赖注入,或任何其他依赖,将按预期工作。