gpt4 book ai didi

asp.net-mvc - 在 ASP.NET MVC Controller 中注入(inject)依赖项的不同方法?

转载 作者:行者123 更新时间:2023-12-04 22:09:20 24 4
gpt4 key购买 nike

在我在网上看到的大多数示例中,MVC Controller 中的 DI 都是这样完成的

public ProductController(IProductRepository Rep)
{
this._rep = Rep;
}

使用了自定义 ControllerFactory,它利用了选择的 DI 框架并注入(inject)了存储库。

为什么以上认为优于
public ProuctController()
{
this._rep = ObjectFactory.GetInstance<IProductRepository>();
}

这将获得相同的结果,但不需要自定义 Controller 工厂。

就测试而言,Test App 可以有一个单独的 BootStrapper。这样,当 Controller 被测试时,他们可以得到假的存储库,当它们被真正使用时,他们会得到真正的存储库。

最佳答案

构造函数注入(inject)(第一种方法)优于服务定位器模式(第二种方法)有几个原因。

首先,服务定位器隐藏了依赖关系。在您的第二个示例中,仅查看公共(public)接口(interface),无法知道 ProductControllers需要存储库。

更重要的是,我必须回显 OdeToCode .我认为

IProductRepository repository = Mockery.NewMock<IProductRepository>();
IProductController controller = new ProductController(repository);


ObjectFactory.SetFactory(IProductRepository, new MockRepositoryFactory())
IProductController controller = new ProductController();

特别是如果 ObjectFactory 配置在测试夹具的 SetUp 中。方法。

最后,服务定位器模式在至少一种特殊情况下显然是次优的:当您编写的代码将被编写您无法控制的应用程序的人使用时。我打赌人们通常更喜欢构造函数注入(inject)(或其他 DI 方法之一),因为它适用于所有场景。为什么不使用涵盖所有情况的方法呢?

(Martin Fowler 在 "Inversion of Control Containers and the Dependency Injection Pattern" 中提供了更彻底的分析,尤其是“服务定位器与依赖注入(inject)”部分)。

关于asp.net-mvc - 在 ASP.NET MVC Controller 中注入(inject)依赖项的不同方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1044403/

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