我正在编写一个 Windows 服务(如果一切按计划进行)将一次运行数月。在服务的整个生命周期中,它将维护多个 WCF 服务(用于与其他本地应用程序通信的命名管道),它将运行一个嵌入式数据存储(可能是 RavenDB,这或多或少与这个问题无关),并且它将使用一些第三方软件来维护 SIP 服务(VoIP 功能)。我面临的一些挑战意味着必须对事件做出反应并创建一些新的业务对象来处理这些事件所代表的内容。
现在,我已经阅读了 Mark Seemann 的书(至少是本次讨论的相关部分),并且我理解为什么服务定位器不好,以及为什么在组合根(在我的情况下是服务起点)中处理它是好的 - 在一般情况。
但是,我不明白这如何适用于每种情况。我看到在你可以在应用程序开始时组合你的整个根的情况下,或者在框架的每个请求使用 IoC 引擎的 MVC 之类的情况下,它是多么完美。但是,对于长期运行的服务,我想在最好的情况下会效率低下,并且在某些情况下不可能预先创建所有对象。我无法想象能够编写一个重要的服务,它可以预先获取它可能需要的所有对象,并且随着生活的继续,永远不需要创建新的对象。
现在,这还不足以将我引向黑暗面并承担隐藏依赖项的代价,就像服务定位器会让我做的那样。但是在这里做什么是正确的?如果我有一个 CallHandlerService 需要创建以响应每个传入呼叫(例如,因为它使用昂贵的非托管资源),我该怎么做?
组合根 + 只是一点点服务定位器?
最后一部分并不严重,但我仍然很想知道如何正确解决这个问题。