StructureMap 2.6+控制处理顺序

时间:2014-01-05 03:18:03

标签: structuremap zeromq

我是StructureMap的新手,正在使用它构建一个使用clrzmq的应用程序,这是一个ZeroMQ的.NET实现。

ZeroMQ应用程序通过创建单个上下文实例来工作,并从该实例创建一个或多个ZMQ套接字以发送内容。

为了干净地关闭clrzmq应用程序,您需要先关闭并处理从ZMQ上下文创建的任何连接的ZMQ套接字,然后,只有在完成后,才能处理ZMQ上下文。

如果您尝试在关闭之前处理上下文&处置从该上下文创建的一个或多个套接字,上下文中的Dispose调用将挂起,您的应用程序将不会退出。

所以,我正在寻找一种方法来确保此应用中的StructureMap容器​​遵守此Dispose命令。

我尝试了一个类似于这样的连接的注册表类:

For< ZeroMQ.ZmqContext >().Singleton();

Profile( "SomeProfile", p =>
    {
        // ZmqContext instances are created with a
        // custom factory method
        p.For< ZeroMQ.ZmqContext >()
            .Use( ZeroMQ.ZmqContext.Create() );

        p.For< ISender >()
            .Use< MyConcreteZmqSender >();
     });

...在上面,“MyConcreteZmqSender”是一个类,它使用它在构造函数中接收的ZMQ上下文实例(唯一的构造函数参数)创建一个ZMQ套接字。它实现了IDisposable,Dispose()实现关闭创建的套接字并在其上调用Dispose()。

我还编写了一个测试用例来测试Dispose行为,如下所示:

    [Test]
    public void TestZmqSender()
    {
        ObjectFactory.Initialize( x =>
        {
            x.AddRegistry<MyZmqRegistry>();
        } );

        ObjectFactory.Profile = "SomeProfile";

        ISender sender = ObjectFactory.Container.GetNestedContainer().GetInstance<ISender>();

        sender.doAllTheThings();

        ObjectFactory.Container.GetNestedContainer().Dispose();
        ObjectFactory.Container.Dispose();
    }

...在上面我尝试使用嵌套容器来获取Zmq发送器实例,认为如果我以这种方式检索它,那么如果我稍后在嵌套的cotainer上调用Dispose,它将在我的套接字发送器上调用Dispose在ZMQ上下文被释放之前,我假设当我在主父容器上调用Dispose时会发生这种情况。

唉,这似乎不是正在发生的事情,这个测试案例永远不会完成。我已经验证了发件人正在通过引用单例ZMQ上下文来正确构造。当然,如果我在处理主容器之前手动调用sender.Dispose(),测试用例就会成功完成。

我的第一次尝试根本没有使用嵌套容器,它也以相同的方式挂起。

任何人都有关于如何完成这项工作的建议,而无需获取所有发件人实例的句柄并手动调用它们上的Dispose()并确保在主容器上调用Dispose()之前完成此操作?

0 个答案:

没有答案