gpt4 book ai didi

c# - 这是依赖注入(inject)的错误使用吗?

转载 作者:行者123 更新时间:2023-11-30 14:09:39 25 4
gpt4 key购买 nike

我正在与一些同事一起开发 MVC 应用程序。所有 Controller 都使用 Unity 将 ServiceFactory 注入(inject)其中...

public HomeController(IServiceFactory serviceFactory)
{
Services = serviceFactory
// Where Services is a property of the Controller
}

现在,我正在编写大量 ViewModel,其中一些 ViewModel 需要从大量服务访问对象。所以,我有一个像这样的模式......

public class MyViewModel
{
public MyViewModel(IServiceFactory services)
{
// Do stuff
}
}

我的 Controller 包含这样的代码......

public ActionResult SomeAction()
{
var model = new MyViewNodel(Services)
// ...
}

我的一些同事认为这不是 DI 的正确用法,但似乎无法阐明原因。

他们是对的吗?如果是,为什么?

最佳答案

您的同事发出危险信号的原因是您通过服务注入(inject)成功地实践了 DI,但您在 Controller 操作中新建了一个 MyViewModel 实例,这对外部“隐藏”了实现细节。

现在,就是说,因为这个 Controller 不应该直接从其他代码中使用,而应该从网络中使用,你可以说这是可以接受的。我个人的偏好是,既然您已经开始注入(inject)依赖项,那么现在就不要停止!

编辑:

正如 James 在评论中提到的那样,通过独立的注入(inject)工厂解析 View 模型实例会好得多。这样您就可以在同一个 Controller 类中解析多个 View 。

private readonly IViewModelFactory _factory;
public HomeController(IViewModelFactory factory)
{
_factory = factory;
var model = _factory.GetViewModelInstance();
// Where Services is a property of the Controller
}

注册时

IMyViewModelFactory

在您的具体类中,解决容器中 IServiceFactory 的注入(inject)问题,将其突出显示为注入(inject)的依赖项。

public ViewModelFactory(IServiceFactory factory)

关于c# - 这是依赖注入(inject)的错误使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28172733/

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