好的,也许这里已经有这样的问题了,但我没有找到它..
问题
我们有很多入口点的大型企业应用程序。应用程序包含如下部分:
- 服务器
- 桌面客户端
- 一些控制台实用程序
- .NET API(单独的程序集,根类称为 like
MyAppAPI
) - COM API(相同的,单独的程序集,您可以从例如 VBScript 访问 API,通过
Set api = CreateObject("MyApp.MyAppAPI")
- Java API(同样)
- Messaging API(单独的组件,用于通过消息队列在层之间进行通信)
我们在这个应用程序中使用 Unity 作为 DI 容器。Server/DesktopClient/Console 实用程序等中的一切都很酷 - 有非常具体的入口点,所以我们只需在那里初始化组合根对象,初始化对象/依赖关系树,一切都像魅力一样工作。他们的问题在于我们的 API。
#1
如何处理库/框架中的 DI?
从上面的链接:
组合根是一个应用程序基础结构组件。
只有应用程序应该有组合根。库和框架不应该。
是的,这很酷,但是.. 我想在我的 API 中使用 DI,它很大!如何处理一个与另一个?
#2
我们有依赖关系,最好应该是单例(例如一些工厂,它控制创建对象的生命周期)。但是,我们可以创建一些 API 对象的实例,如何在它们之间共享这个单例实例呢?甚至更多——我们可以在同一个域中创建一些 .NET API 对象的实例和一个/一些 COM API 对象的实例(如果你愿意,我可以在可能的情况下在评论中解释)..
我现在拥有的
正如我所说,应用程序没有问题,问题存在于库(API)中。所以,我现在拥有的
- 我有课
ShellBase
- 此类包含静态字段
_Shells
和公共静态方法Get
以及Release
- 容器之间存在层次结构(例如 API 的容器继承自 MessagingAPI,Server 和 DesktopClient 容器继承自 .NET API 容器等)
- 当有人要求新的外壳(通过
Get
方法)时,ShellBase
检查是否已经存在这样的容器(或超容器,来自子类),并返回该实例。或者创建一个新的
我不喜欢这种方式,但这是我现在能想象到的最好的方式。
可能的解决方案
创建类似的东西APIFactory
,这将创建我们的 API 对象,但它看起来......对于最终用户来说太复杂了。我不想在用户文档中写:“请先创建并保留 APIFactory 实例,然后您可以使用此工厂创建 API 实例”。它很丑。我们的用户应该只写var api = new API()
,并使用它。
所以,小伙伴们,你们怎么看?