2

我正在寻找有关使用和配置 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 类,以及如何配置容器以使用它?谢谢!

4

2 回答 2

2

这个问题更多是关于更新单例组件而不是拦截。这个问题回答了更新单例的问题

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

也许问题在于这个组件被破坏了(为什么会发生这种情况?)

于 2009-02-17T02:01:52.347 回答
0

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

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

或者,另一种方法是使用单例生活方式在容器中注册您的服务的装饰器,但您在容器中注册的实际底层服务具有瞬态生活方式 - 然后当您需要刷新组件时,只需处置持有的瞬态底层组件由装饰器替换它并用一个新解决的实例替换它(使用 components 键而不是服务来解决它,以避免获取装饰器) - 这避免了与其他单例服务(未被“刷新”)持有的问题到过时的服务上,这些服务已经被处理使它们无法使用,但确实需要一些铸造等才能使其工作

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

1)使用静态类型的装饰器来包装我的 RealResource(如上)。一旦你获得了许多这样的代理,为它们创建装饰器就变得很痛苦。

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

2) 到目前为止是优越的,但似乎温莎可能已经能为我做些什么。所以,我想知道是否有任何容器 automagic,它可以让我在配置时注册一个拦截器,而不是创建自己的工厂?

像这样的伪代码:

container.AddComponent("dynamicProxyWrapper", typeof(IRealResource), typeof(RealResource)).UsingInterceptor(typeof(RealResourceInterceptor));
于 2009-02-17T09:47:38.450 回答