gpt4 book ai didi

c# - MVC 中的 Unity DI 有什么好处?

转载 作者:行者123 更新时间:2023-11-30 16:18:51 26 4
gpt4 key购买 nike

我对 Unity 和 IoC 有点陌生,但对 MVC 不是。我一直在阅读和阅读有关将 Unity 与 MVC 结合使用的信息,我一直看到的唯一真正有用的东西是能够通过 Controller 获得免费的 DI。

从这里开始:

    public HomeController() : this(new UserRepository())
{
}

public HomeController(IUserRepository userRepository)
{
this.UserRepository = userRepository;
}

对此:

    public HomeController(IUserRepository userRepository)
{
this.UserRepository = userRepository;
}

基本上,允许我删除无参数构造函数。这太棒了,我肯定会实现它,但对于所有关于 IoC 库的炒作来说,它似乎并没有那么好。将 Unity 用作服务定位器的方式听起来很有说服力,但许多人认为这是一种反模式。

所以我的问题是,服务定位问题和 View 和过滤器的一些 DI 机会,使用 Unity 我还有什么好处吗?我只是想确保我没有错过一些很棒的东西,比如对所有类构造函数的免费 DI 支持。

编辑:

我理解将 Unity DI 与 MVC Controller 结合使用背后的可测试性目的。但我所要做的就是添加一个额外的小构造函数,nix Unity,我可以同样进行 UnitTest。当备选方案更简单时,注册存储库类型和拥有自定义 Controller 工厂的最大好处在哪里?替代方案是原生 DI。我想我真的很想知道 Unity(或任何 IoC 库)除了不好的服务定位之外还有什么优点。免费的 Controller DI 真的是我从 Unity 得到的唯一东西吗?

最佳答案

一个好的 IoC 容器不仅会为您创建具体的类,还会检查该类型与其他类型之间的耦合。如果有额外的依赖关系,它会解析它们并创建所有需要的类的实例。

您可以做一些奇特的事情,例如条件绑定(bind)。这是一个使用 Ninject(我的首选 IoC)的示例:

ninjectKernel.Bind<IValueCalculator>().To<LinqValueCalculator>();

ninjectKernel.Bind<IValueCalculator>().To<IterativeValueCalculator().WhenInjectedInto<LimitShoppingCart>();

ninject 在这里做的是在注入(inject) LimitShoppingCart 时创建一个 IterativeValueCalculator 实例,并为任何其他注入(inject)创建一个 LinqValueCalulator 实例。

最大的好处是关注点分离(解耦)和可测试性。

关于c# - MVC 中的 Unity DI 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15775755/

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