我是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()之前完成此操作?