StructureMap,如何防止在两个层次结构之间重用实例?

时间:2014-05-09 08:27:00

标签: wcf structuremap

我正在尝试编写客户端服务器系统的端到端'单元'测试。

在我的测试中,我创建了一个服务器实例和一个客户端。

然后我调用在服务器上调用WCF服务的客户端。效果很好。

然而 - 我可以看到,至少在一种情况下(StructureVault),在两个应用程序对象层次结构中重用完全相同的实例,这是不可取的,这不仅仅是因为两个应用程序都在对象中注册缓存项。 此外,当服务器在WCF调用期间尝试访问它时,客户端上的lock(this){}包装会导致死锁(这会提醒我这个问题)。

我在这里找到了关于SO的讨论,并尝试了下面的结构。它没有解决我的问题。

我可以看到有问题的对象按预期创建了两次,但最后创建的对象在两个层次结构中使用。

下面的代码中的GetTestRoot ...调用在返回层次结构的根之前调用ObjectFactory.Initialize来连接。 StructureVault对象应该是每个层次结构中的Singleton。

        For<IStructureVault>()
            .Singleton().Use<StructureVault>();

有关做什么/尝试的任何建议?!

谢谢,

丹麦安德斯

代码:

        var testRootCalculationServer =
            DbIntegrationTestHelper
                .GetTestRootCalculationServer("2",
                                              UserNameConst.SystemName,
                                              Rap1DEnvironment.LocalDevEnv);
        StructureMap.ObjectFactory.EjectAllInstancesOf<IStructureVault>();
        StructureMap.ObjectFactory.Initialize(x=>{});

        var testRootRap1DGui1 =
            DbIntegrationTestHelper
                .GetTestRootRap1DGui("1",
                                     UserNameConst.SystemName,
                                     Rap1DEnvironment.LocalDevEnv, false);

1 个答案:

答案 0 :(得分:0)

最后我发现了问题。

在上面创建的第一个“测试根”的CalculationServer中,我正在托管WCF服务。每当发出新请求时,都会生成一个新的WCF服务实例,利用当时最新的ObjectFactory。在实例化上面的第二个“测试根”时,ObjectFactory仍然处于离开的状态。

道德:当托管的WCF服务产生一个新实例时,请注意StructureMap.ObjectFactory的内容是什么!