gpt4 book ai didi

c# - 将 IoC 与内部对象一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 14:36:05 25 4
gpt4 key购买 nike

我目前正在为我使用的程序编写一个开源 SDK,并且我在内部使用 IoC 容器 (NInject) 来连接我所有的内部依赖项。

我有一些标记为内部的对象,这样我就不会挤满公共(public) API,因为它们仅在内部使用,不应被用户看到,例如工厂和其他对象。我遇到的问题是 NInject 无法创建内部对象,这意味着我必须将所有内部对象标记为公共(public),这会占用公共(public) API。

我的问题是:是否有办法解决这个问题,还是我做错了?

附言。我考虑过使用 InternalsVisiableTo 属性,但我觉得这有点难闻。

最佳答案

快速查看其他答案:您所做的事情似乎并没有太大不同,以至于 Ninject 存在根本性错误,您需要对其进行修改或替换。在许多情况下,您不能“直接进入 [the] 内部”,因为它们依赖于 Unresolved 依赖注入(inject);因此首先使用了 Ninject。此外,听起来您已经拥有一组内部接口(interface),这就是提出问题的原因。

想法:直接在您的 SDK 或库中使用 Ninject 的一个问题是您的用户将不得不在他们的代码中使用 Ninject。这对您来说可能不是问题,因为这是您的 IoC 选择,所以您无论如何都会使用它。如果他们想使用另一个 IoC 容器怎么办,那么现在他们实际上有两个正在运行的重复工作。更糟糕的是,如果他们想使用 Ninject v2 而您使用的是 v1.5,那么情况就会变得更加复杂。

最佳情况:如果您可以重构您的类,使它们通过依赖注入(inject)获得所需的一切,那么这是最干净的,因为库代码不需要任何国际奥委会容器。该应用程序可以连接依赖项并且它只是流动。但这并不总是可行的,因为有时库类需要创建具有您无法通过注入(inject)解决的依赖项的实例。

建议 CommonServiceLocator (和它的 the Ninject adapter)是专门为这种情况设计的(具有依赖关系的库)。您针对 CommonServiceLocator 进行编码,然后应用程序指定哪个 DI/IoC 实际支持该接口(interface)。

这有点痛苦,因为现在您必须在您的应用程序中添加 CommonServiceLocator,但 CommonServiceLocator 非常轻量级。您的 SDK/库代码使用相当干净的 CommonServiceLocator。

关于c# - 将 IoC 与内部对象一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1029602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com