Inversion of control 在windsor容器中使用DynamicProxy作为装饰图案

Inversion of control 在windsor容器中使用DynamicProxy作为装饰图案,inversion-of-control,castle-windsor,decorator,castle-dynamicproxy,Inversion Of Control,Castle Windsor,Decorator,Castle Dynamicproxy,我正在寻找有关使用和配置windsor以提供动态代理来拦截对另一个类实例的调用的一些信息 My类表示一个资源,出于性能原因,容器应将其作为长期实例保留。但是,有时此资源可能会转换为不可用状态,并需要更新。我希望容器能够处理这个问题,这样客户端代码就不必处理了。我可以创建自己的工厂来实现这一点,我想知道是否有一些温莎注册的酷为我这样做,所以我不必创建单独的工厂类:) 下面是一些伪代码来演示该问题: public interface IVeryImportantResource { void

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

My类表示一个资源,出于性能原因,容器应将其作为长期实例保留。但是,有时此资源可能会转换为不可用状态,并需要更新。我希望容器能够处理这个问题,这样客户端代码就不必处理了。我可以创建自己的工厂来实现这一点,我想知道是否有一些温莎注册的酷为我这样做,所以我不必创建单独的工厂类:)

下面是一些伪代码来演示该问题:

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();
    }
}
公共接口IveryImportentResource
{
无效操作();
}
公共类RealResource:IveryImportentResource
{
公共布尔损坏{get;set;}
公共操作()
{
//做一些真正的实现
}
}
公共类RealResourceInterceptor:IInterceptor
{
私有只读IKernel内核;
公共RealResourceInterceptor(IKernel内核)
{
内核=内核;
}
公共无效拦截(IInvocation调用)
{
RealResource=invocation.InvocationTarget作为RealResource;
if(resource.Corrupt)
{
//清理此实例,因为它已损坏
ReleaseComponent(资源);
RealResource newResource=kernel.Resolve();//获取一个新的
//现在我希望发生的事情是这样的
//但是这个属性没有setter,所以这不起作用
//另外,我想知道如何注册RealResourceInterceptor以及RealResourceInterceptor
invocation.InvocationTarget=newResource;
}
invocation.procedure();
}
}

有没有关于如何实现我的RealResourceInterceptor类的想法,以及如何配置容器来使用它?谢谢

这个问题更多的是更新单例组件,而不是拦截。更新单身人士的问题已在中得到解答

一句话:这并不像看上去那么容易,这种方法有很多陷阱


可能问题在于该组件已损坏(为什么会发生这种情况?

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

感谢您的链接,下面引用的部分大致描述了我目前的做法:

另一种方法是 请一位装饰师为您服务 在容器中注册的 单身生活方式,但你的实际 在中注册的基础服务 短暂生活方式的容器- 然后当您需要刷新 组件只需处理 持有的临时基础组件 装饰师,并将其替换为 新解析的实例(解析它) 使用components键,而不是 服务,以避免 decorator)-这避免了与 其他单例服务(不包括 被“刷新”)从坚持到 过时的服务已经过时 决定让它们不能用,但是 是否需要一些铸造等 让它工作

我的问题不是这些,而是:

1) 使用静态类型的decorator包装我的RealResource(如上所述)。一旦你得到了很多这样的代理,为它们创建装饰器就成了一件痛苦的事情

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

2) 虽然比我强,但似乎温莎已经能为我做些什么了。所以,我想知道是否有任何容器automagic,它允许我在配置时注册拦截器,而不是创建自己的工厂

类似这样的伪代码:

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

你试过WCF设施吗?使用城堡设施是前进的方向