Inversion of control 在windsor容器中使用DynamicProxy作为装饰图案
我正在寻找有关使用和配置windsor以提供动态代理来拦截对另一个类实例的调用的一些信息 My类表示一个资源,出于性能原因,容器应将其作为长期实例保留。但是,有时此资源可能会转换为不可用状态,并需要更新。我希望容器能够处理这个问题,这样客户端代码就不必处理了。我可以创建自己的工厂来实现这一点,我想知道是否有一些温莎注册的酷为我这样做,所以我不必创建单独的工厂类:) 下面是一些伪代码来演示该问题: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
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设施吗?使用城堡设施是前进的方向