使用DynamicProxy作为windsor容器中的装饰器模式

时间:2009-02-16 21:59:33

标签: inversion-of-control castle-windsor decorator castle-dynamicproxy

我正在寻找有关使用和配置windsor的一些信息,以提供动态代理来拦截对另一个类的实例的调用。

我的类表示一个资源,出于性能原因,应该由容器保留为长期存在的实例。但是,有时此资源可能会转换为不可用状态,并需要更新。我希望容器能够处理这个,所以客户端代码不需要。我可以创建自己的工厂来做这件事,我想知道是否有一些Windsor注册冷静为我做这样我所以我不必创建单独的工厂类:))

这是一些用于演示问题的伪代码:

public interface IVeryImportantResource
{
    void SomeOperation();
}

public class RealResource : IVeryImportantResource
{
    public bool Corrupt { get; set; }

    public void SomeOperation()
    {
        //do some real implementation
    }
}

public class RealResourceInterceptor : IInterceptor
{
    private readonly IKernel kernel;

    public RealResourceInterceptor(IKernel Kernel)
    {
        kernel = Kernel;
    }

    public void Intercept(IInvocation invocation)
    {
        RealResource resource = invocation.InvocationTarget as RealResource;

        if(resource.Corrupt)
        {
            //tidy up this instance, as it is corrupt
            kernel.ReleaseComponent(resource);
            RealResource newResource = kernel.Resolve<RealResource>(); //get a new one
            //now what i would like to happen is something like this
            //but this property has no setter, so this doesn't work
            //also, i would like to know how to register RealResourceInterceptor as well RealResourceInterceptor
            invocation.InvocationTarget = newResource;
        }
        invocation.Proceed();
    }
}

任何想法如何实现像我的RealResourceInterceptor类,以及如何配置容器使用它?谢谢!

2 个答案:

答案 0 :(得分:2)

这个问题更多的是关于更新单例组件而不是拦截。更新单身人士的问题在this question中得到了解答。

底线:它并不像看起来那么容易,这种方法存在很多陷阱。

问题可能在于这个组件被破坏了(为什么会这样?)

答案 1 :(得分:0)

我的对象是WCF代理。这些对象将转换为故障状态,使其无法使用。我无法控制他们何时或是否会过渡。我只能检测到它已经发生,并重新创建一个新的代理。

感谢您的链接,下面引用的部分大致描述了我目前的工作方式:

  

另一种方法是   有一个装饰你的服务   在容器中注册了一个   单身生活方式,但你的实际   注册的基础服务   短暂的生活方式的容器 -   然后当你需要刷新   组件只是处理   暂时的基础组成部分   装饰者用一个替换它   新解决的实例(解决它   使用组件键,而不是   服务,以避免得到   装饰者) - 这避免了问题   其他单身人士服务(不是   从持有“被刷新”   过时的陈旧服务   处置使它们无法使用,但是   确实需要一些铸造等   让它发挥作用

我的问题是,而不是其中任何一个:

1)使用静态类型的装饰器来包装我的RealResource(如上所述)。一旦你获得了许多代理,就必须为它们创建装饰器。

2)使用工厂对象创建动态代理来管理任何WCF代理的状态。

2)远远超过了,但似乎温莎可能已经能够为我做的事情。所以,我想知道是否有任何容器自动化,这将允许我在配置时注册拦截器而不是创建我自己的工厂?

像这样的伪代码:

container.AddComponent("dynamicProxyWrapper", typeof(IRealResource), typeof(RealResource)).UsingInterceptor(typeof(RealResourceInterceptor));