我正在使用castle-windsor框架,我想在框架发布特定(第三方)组件之前调用一段代码。
我认为我可以通过向OnDestroy
添加委托来实现此目的,但框架始终首先调用Dispose
。 (见下面的例子)。
在调用 Dispose
之前,我有什么选择来调用代码?
public class TestClass : IDisposable
{
static long _globalInstanceCount = 0;
readonly long _instanceId;
public TestClass()
{
_instanceId = Interlocked.Increment(ref _globalInstanceCount);
Trace.WriteLine(string.Format("TestClass ({0}) - Constructor called", _instanceId));
}
public void ByeBye()
{
Trace.WriteLine(string.Format("TestClass ({0}) - ByeBye called", _instanceId));
}
void IDisposable.Dispose()
{
Trace.WriteLine(string.Format("TestClass ({0}) - Dispose called", _instanceId));
}
}
class Program
{
static void Main(string[] args)
{
{
Trace.WriteLine("Testing as a singleton");
var container = new WindsorContainer()
.Register(Component.For<TestClass>()
.LifeStyle.Singleton
.OnDestroy(t => t.ByeBye())
);
TestClass tc = container.Resolve<TestClass>();
Trace.WriteLine("Releasing the component");
container.Release(tc);
Trace.WriteLine("Disposing of the container");
container.Dispose();
}
{
Trace.WriteLine("Testing transient");
var container = new WindsorContainer()
.Register(Component.For<TestClass>()
.LifeStyle.Transient
.OnDestroy(t => t.ByeBye())
);
TestClass tc = container.Resolve<TestClass>();
Trace.WriteLine("Releasing the component");
container.Release(tc);
Trace.WriteLine("Disposing of the container");
container.Dispose();
}
}
}
这会产生以下输出。如您所见,ByeBye
之后调用了Dispose
。
作为单身人士进行测试
TestClass(1) - 名为
的构造函数发布组件
处置容器
TestClass(1) - 名为
的DisposeTestClass(1) - ByeBye称为
测试瞬态
TestClass(2) - 名为
的构造函数发布组件
TestClass(2) - Dispose called
TestClass(2) - ByeBye称为
处置容器
我试图使用拦截器解决这个问题,但事实证明,Windsor框架在原始组件上调用Dispose
绕过任何拦截器。
Trace.WriteLine("Testing transient with interceptor");
var container = new WindsorContainer()
.Register(Component.For<TestClassInterceptor>().LifeStyle.Transient,
Component.For<TestClass>()
.LifeStyle.Transient
.OnDestroy(t => t.ByeBye())
.Interceptors<TestClassInterceptor>()
);
TestClass tc = container.Resolve<TestClass>();
tc.Hello();
Trace.WriteLine("Releasing the component");
container.Release(tc);
Trace.WriteLine("Disposing of the container");
container.Dispose();
以下输出结果。看到TestClass (3) - Dispose
被独立于拦截器调用。
使用拦截器测试瞬态
TestClassInterceptor(1) - 名为
的构造函数TestClass(3) - 名为
的构造函数TestClassInterceptor(1) - 交互方法&#34; Hello&#34;
TestClass(3) - 你好叫
发布组件
TestClass(3) - 处理名为
TestClassInterceptor(1) - 拦截方法&#34; ByeBye&#34;
TestClass(3) - ByeBye称为
TestClassInterceptor(1) - 名为
的Dispose处置容器