我正在编写一个 Windows 服务,如果一切顺利,它将运行数个月。在服务的生命周期内,它将维护几个 WCF 服务(用于与其他本地应用程序通信的命名管道),运行嵌入式数据存储(可能是 RavenDB,对于此问题来说不太相关),并使用一些第三方软件维护 SIP 服务(VoIP 功能)。我面临的挑战之一是需要根据事件做出反应,并创建一些新的业务对象来处理这些事件代表的内容。
现在,我已经阅读了 Mark Seemann 的书籍(至少是与此讨论相关的部分),我理解了为什么服务定位器是不好的,以及为什么在组合根(在我的情况下是服务启动点)中处理这个问题是好的 - 在一般情况下。
然而,我不明白这如何适用于每种情况。我看到在你可以在应用程序启动时组合整个根的情况下,或者在诸如 MVC 这样的框架中 IoC 引擎按请求使用的情况下,这将是完美的。但是,对于长时间运行的服务,我想最好的情况下它会效率低下,在某些情况下甚至是不可能的,因为你无法预先创建所有对象。我无法想象能够编写一个复杂的服务来获得它可能需要的所有对象,并且永远不需要在生命周期内创建新对象。
现在,这还不足以吸引我去采用服务定位器这样的隐藏依赖的代价。但是,在这里应该怎么做呢?如果我有一个 CallHandlerService 需要根据每个传入呼叫创建(因为它使用昂贵的非托管资源,例如),我该如何处理?
组合根 + 一点点服务定位器?
最后一部分不是认真的,但我仍然很想知道如何正确解决这个问题。
现在,我已经阅读了 Mark Seemann 的书籍(至少是与此讨论相关的部分),我理解了为什么服务定位器是不好的,以及为什么在组合根(在我的情况下是服务启动点)中处理这个问题是好的 - 在一般情况下。
然而,我不明白这如何适用于每种情况。我看到在你可以在应用程序启动时组合整个根的情况下,或者在诸如 MVC 这样的框架中 IoC 引擎按请求使用的情况下,这将是完美的。但是,对于长时间运行的服务,我想最好的情况下它会效率低下,在某些情况下甚至是不可能的,因为你无法预先创建所有对象。我无法想象能够编写一个复杂的服务来获得它可能需要的所有对象,并且永远不需要在生命周期内创建新对象。
现在,这还不足以吸引我去采用服务定位器这样的隐藏依赖的代价。但是,在这里应该怎么做呢?如果我有一个 CallHandlerService 需要根据每个传入呼叫创建(因为它使用昂贵的非托管资源,例如),我该如何处理?
组合根 + 一点点服务定位器?
最后一部分不是认真的,但我仍然很想知道如何正确解决这个问题。