Asp.net mvc 如何将依赖项注入与构造函数参数一起使用?

Asp.net mvc 如何将依赖项注入与构造函数参数一起使用?,asp.net-mvc,dependency-injection,ninject,Asp.net Mvc,Dependency Injection,Ninject,当我还想将参数传递给类的构造函数时,使用依赖项注入的正确方法是什么 例如,这里我希望注入一个IApplicationService,但我还希望传入一个应用程序id: public class ApplicationViewModel { private readonly IApplicationService _applicationService; private readonly int _applicationId; public ApplicationView

当我还想将参数传递给类的构造函数时,使用依赖项注入的正确方法是什么

例如,这里我希望注入一个IApplicationService,但我还希望传入一个应用程序id:

public class ApplicationViewModel
{
    private readonly IApplicationService _applicationService;

    private readonly int _applicationId;

    public ApplicationViewModel(IApplicationService applicationService, int applicationId)
    {
        _applicationService = applicationService;
        _applicationId = applicationId;
    }
}
目前,我正在控制器上使用构造函数注入并将其传递给:

public class HomeController : Controller
{
    private readonly IApplicationService _applicationService;

    public HomeController(IApplicationService applicationService)
    {
        _applicationService = applicationService;
    }

    public ActionResult Application(int applicationId)
    {
        return View(new ApplicationViewModel(_applicationService, applicationId));
    }
}
这是可行的,但看起来有点难看。控制器可以有很多动作方法,每个动作方法都需要很多服务。控制器最终会注入大量基本上不会使用的东西。此外,我更希望能够在不更改控制器的情况下更改视图模型需要注入的内容

我还尝试在视图模型上使用属性注入,但在MVC5中不起作用,而且属性注入似乎通常被认为是一个坏主意™.


我确信问题在于我没有正确地构造代码。有什么想法吗?

通常在MVC中,控制器将构造视图模型(可能通过服务),因此视图模型不需要依赖项。在这种情况下,视图模型只包含视图要显示的数据。有没有一个原因可以解释为什么你会采取不同的做法?这种方法有一个问题。您的模型绑定器可能还需要创建
ViewModel
的实例。在这种情况下,您将需要一个可以注入依赖项的自定义模型绑定器。正如@YacoubMassad所述,如果您的模型只包含状态(和元数据),而不包含任何行为,那么它就不需要依赖项,这会更好。
ApplicationViewModel
在我看来是运行时数据。运行时数据通常不应该是对象图的任何部分。关于这个主题的完整博客可以找到,谢谢你的评论-你们都很正确。我已经将逻辑移出了视图模型,使其成为一个愚蠢的容器。解决了这个问题,现在更好地遵循MVC模式。现在不知道该怎么处理这个问题。。。