c# – 这是依赖注入的错误用法吗?

我正和一些同事一起研究MVC应用程序.控制器都有一个ServiceFactory使用Unity注入它们…

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

现在,我正在编写一些viewmodel,其中一些viewmodel需要从多个Services访问对象.所以,我有这样的模式……

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

我的控制器包含这样的代码……

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

我的一些同事认为这不是DI的正确使用,但似乎无法阐明为什么会这样.

他们是对的吗?如果是这样的话?

解决方法

你的同事抛出危险信号的原因是因为你在服务注入时成功地练习了DI,但是你在控制器动作中新建了一个Myviewmodel实例,它从外部“隐藏”了实现细节.

现在,这就是说,因为这个控制器不应该直接从其他代码中消费,而是从网络上消费,你可以认为这是可以接受的.我个人的偏好是因为你已经开始注入依赖项,所以现在不要停止!

编辑:

正如James在评论中提到的那样,通过一个独立的注入工厂解决你的viewmodel实例会好得多.这样您就可以在同一个控制器类中解析多个视图.

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

注册

IMyviewmodelFactory

对于您的具体类,解决容器中IServiceFactory的注入,将其突出显示为注入依赖项.

public viewmodelFactory(IServiceFactory factory)

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...