我正在寻找有关使用和配置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类,以及如何配置容器使用它?谢谢!
答案 0 :(得分:2)
这个问题更多的是关于更新单例组件而不是拦截。更新单身人士的问题在this question中得到了解答。
底线:它并不像看起来那么容易,这种方法存在很多陷阱。
问题可能在于这个组件被破坏了(为什么会这样?)
答案 1 :(得分:0)
我的对象是WCF代理。这些对象将转换为故障状态,使其无法使用。我无法控制他们何时或是否会过渡。我只能检测到它已经发生,并重新创建一个新的代理。
感谢您的链接,下面引用的部分大致描述了我目前的工作方式:
另一种方法是 有一个装饰你的服务 在容器中注册了一个 单身生活方式,但你的实际 注册的基础服务 短暂的生活方式的容器 - 然后当你需要刷新 组件只是处理 暂时的基础组成部分 装饰者用一个替换它 新解决的实例(解决它 使用组件键,而不是 服务,以避免得到 装饰者) - 这避免了问题 其他单身人士服务(不是 从持有“被刷新” 过时的陈旧服务 处置使它们无法使用,但是 确实需要一些铸造等 让它发挥作用
我的问题是,而不是其中任何一个:
1)使用静态类型的装饰器来包装我的RealResource(如上所述)。一旦你获得了许多代理,就必须为它们创建装饰器。
2)使用工厂对象创建动态代理来管理任何WCF代理的状态。
2)远远超过了,但似乎温莎可能已经能够为我做的事情。所以,我想知道是否有任何容器自动化,这将允许我在配置时注册拦截器而不是创建我自己的工厂?
像这样的伪代码:
container.AddComponent("dynamicProxyWrapper", typeof(IRealResource), typeof(RealResource)).UsingInterceptor(typeof(RealResourceInterceptor));