我正在尝试编写客户端服务器系统的端到端'单元'测试。
在我的测试中,我创建了一个服务器实例和一个客户端。
然后我调用在服务器上调用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);
答案 0 :(得分:0)
最后我发现了问题。
在上面创建的第一个“测试根”的CalculationServer中,我正在托管WCF服务。每当发出新请求时,都会生成一个新的WCF服务实例,利用当时最新的ObjectFactory。在实例化上面的第二个“测试根”时,ObjectFactory仍然处于离开的状态。
道德:当托管的WCF服务产生一个新实例时,请注意StructureMap.ObjectFactory的内容是什么!