【问题标题】:IoC or Dependency Injection frameworks to support for an MVVM framework支持 MVVM 框架的 IoC 或依赖注入框架
【发布时间】:2025-02-17 11:00:01
【问题描述】:

我一直在开发一个新的 MVVM 框架here

它有一些有趣的概念,但我想支持多个 IoC 容器。现在我只支持 MEF,因为它带有 .Net 4.0。

我应该从一开始就支持哪些更常见的 IoC/DI 框架?我想可能是 3 个左右。

温莎城堡?忍者?

编辑:

为了澄清,我问的是当今常用的 IoC/DI 框架。我还希望能了解一些我还没有听说过的新热点。

【问题讨论】:

  • 你如何支持他们?你看过 CommonServiceLocator 吗?或者我的docs.griffinframework.net/specification
  • 我还没有弄清楚如何。我正在考虑自己将其抽象出来,但我会查看您的链接。
  • 看看 ASP.NET MVC 使用 DI 容器的方式:它没有。它有一个与 Activator.CreateInstance 一起工作的 DefaultControllerFactory 实现,并且很容易插入你自己的控制器工厂,它与你自己的 DI 容器一起工作。
  • 是的,这就是我想做的。我想提供一个MEFFactory、WindsorFactory、NinjectFactory等,我可以开箱支持哪些常用的容器? (这是我的问题)

标签: c# wpf mvvm dependency-injection inversion-of-control


【解决方案1】:

框架不应不使用 DI 容器 - only applications should use containers

无论用户是想使用容器还是Poor Man's DI,库和框架的设计都应该是friendly to any sort of DI

假设用户将使用Poor Man's DI,而您将自动与容器无关

【讨论】:

  • 在我的框架中有一个使用 DI 的 View ViewModel 连接机制。这就是使用容器的原因。我不希望我的框架的用户在他的视图上手动设置 DataContext。不过我明白你的意思。
  • 我想支持类似于 Caliburn 所做的容器:caliburn.codeplex.com
  • 将您的 DI 逻辑移出您的库,并将其封装到为您设置数据上下文的接口中。然后应用程序开发人员使用那里选择的 DI 容器来实现您的接口
  • 是的,这正是我们的想法。然后我将有单独的库来支持 MEF、Castle Windsor 等。我的问题是要支持这些库中的 哪些
  • Prism 提供了他想要实现的相同类型的 IoC/DI,因此库/框架可以很好地使用它们,只要它们提供在不适合的情况下轻松切换到另一个用户。
【解决方案2】:

UnityCastle Windsor 在我看来应该是必须的,尤其是 Unity,因为它用于 Prism 并且它是企业库的一部分(为了便于移植)。还有 Castle windsor,因为它易于使用(适用于更广泛的社区)

【讨论】:

    【解决方案3】:

    另一种方法是提供一个简单的 IoC 容器,就像 Mvvm Light 所做的那样。

    【讨论】:

    • 我刚刚支持 MEF 而不是那个。当 MEF 附带 .Net 4.0 时,我认为没有理由这样做。