2016-09-26 72 views
0

我有一个WCF服务需要访问信息的只读存储库。这个存储库创建起来很昂贵,这意味着它需要创建一次并在服务调用/服务类的实例之间共享。一般来说,让类线程安全并不是一个问题,也不会使存储库线程安全。我在考虑两个选项共享程序存储库:在WCF共享只读数据 - 选择InstanceContextMode

  1. 只需设置“InstanceContextMode”到“一”和“ConcurrencyMode”到“多”,手动创建一个服务对象,并且在单个存储库注入到它通过构造函数。

  2. 使用“InstanceContextMode”设置为“PerCall”(或“PerSession”)和执行我的服务定制服务实例提供。作为创建过程的一部分,此实例提供程序可以将单个实例的存储库注入所有服务类实例(构造函数)。

根据我的情况(假设我已经提交了足够的信息),不使用选项1的原因是什么?对我来说,它似乎是最简单的?我一直在阅读将“InstanceContextMode”设置为“Single”对性能/可伸缩性不利,但我无法理解这是否始终如此,或者是否取决于服务属性。

如前所述我意识到这可能是我还没有提供关于我的任何的您特定的情况下足够的信息能够回答。

最好的问候, 约翰

回答

0

WCF服务需要访问信息的只读存储库。这个仓库是昂贵的创建,这意味着它需要创建一次和服务调用之间共享/服务类

上述场景更容易,你必须使用一个缓存机制,而不是案件的情况下,你必须使用“InstanceContextMode”的情况。

所以,你应该能够通过使用MemoryCache实现这一目标。您可以将只读对象加载到内存缓存中,并安全地在并发Web服务调用中共享它们。

+0

感谢您的回答!这听起来像是一个很好的选择,并且与解决方案#2(多个实例)具有相同的主题。但是,如果#1是一个不好的解决方案,并且如果是:为什么?对我来说,了解这一部分非常重要。 –

+0

在我看来,#1不好,因为它使你的服务单线程化。如果您在API中使用此模式,可以通过多个系统或设备访问该模式,您的Api将几乎不可用。根据MSDN,_Single:每个实例上下文一次最多允许在实例上下文中有一个线程处理消息。希望使用相同实例上下文的其他线程必须阻塞,直到原始线程退出实例上下文._ –

+0

这不是对“ConcurrencyMode”的描述以及该设置的选项“Single”吗?在#1中,我打算使用设置为“Multiple”的“ConcurrencyMode”和设置为“Single”的“InstanceContextMode”。对我来说,这意味着将使用单个对象来服务所有服务调用,并且该单个对象将由多个调用并发使用。这当然要求线程同步。 –