DI ninject为控制器工作但不是视图模型

Ano*_*use 5 asp.net-mvc dependency-injection ninject

嗨,我正在使用ninject与MVC应用程序.

我确信我已正确设置,因为我能够让它适用于我的控制器.以下是控制器的示例,它正常工作:

public class GstRateController : Controller
    {
        private readonly IUnitOfWork _unitOfWork;

        public GstRateController(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }
...
Run Code Online (Sandbox Code Playgroud)

然后我认为它在viewModel上也会很好所以我尝试了:

public class SettingController : Controller
    {
        private readonly IUnitOfWork _unitOfWork;

        public SettingController(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }
Run Code Online (Sandbox Code Playgroud)

然后我通过以下方式在控制器中实例化视图模型:

public ActionResult Index()
        {
            return View("Index", Activator.CreateInstance<SettingViewModel>());
        }
Run Code Online (Sandbox Code Playgroud)

但这给了我错误:

没有为此对象定义的无参数构造函数.

我是DI的新手.有人可以告诉我如何为viewmodels实现这个目标吗?

Dar*_*rov 4

它适用于控制器而不是视图模型的原因是,当您安装 NInject NuGet 时,它会注册一个自定义依赖项解析器,并且 ASP.NET MVC 框架使用控制器工厂或依赖项解析器来实例化控制器。您可以在本文中阅读有关依赖项解析器的更多信息。

另一方面,视图模型是为满足给定视图的要求而专门设计的类。由于您手动实例化它们,DI 框架永远无法拦截并向它们注入任何依赖项。他们不应该有依赖性。它们应该是从域模型映射的简单 POCO 对象。它们代表一个或多个域模型的项目。

  • 那么如何实现“厚模态,瘦控制器”呢?据我所知,任何涉及数据或数据操作的东西都应该在模型中。我们应该如何传递数据操纵器对象和/或上下文(即实体上下文)对象? (2认同)