如何在组件处理之前运行一段代码?

时间:2012-01-17 06:14:53

标签: castle-windsor

我正在使用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) - 名为

的Dispose      

TestClass(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      

处置容器

0 个答案:

没有答案