C# mvc5控制器中的Ninject

C# mvc5控制器中的Ninject,c#,asp.net-mvc,ninject,C#,Asp.net Mvc,Ninject,如果我想使用Ninject在HomeController中创建服务,我可以执行以下操作: IUserService _userService; public HomeController(IUserService userService) { _userService = userService; } public ActionResult SomeMethod() { userService.DoSomethi

如果我想使用Ninject在HomeController中创建服务,我可以执行以下操作:

    IUserService _userService;

    public HomeController(IUserService userService)
    {
        _userService = userService;
    }

    public ActionResult SomeMethod()
    {
        userService.DoSomething();
       return View();
    }

    public ActionResult SomeOtherMethod()
    {
        //I don't use the service here
       return View();
    }
但是,假设我只需要在我的控制器方法(SomeMethod)中的一个上使用服务——上面的构造函数为控制器中的所有方法(甚至是SomeOtherMethod)激发。看起来很浪费

如果我将其更改为以下内容,它将一直工作到返回视图为止,然后我将得到一个错误(如中所述):

只是在构造函数中放入ninject没有开销,所以没问题吗?或者我需要其他的注射方法吗


谢谢。

我认为,如果您在其他方法中不需要依赖项,那么您的类有太多的责任,您可能应该重新设计它,以便这些方法位于不同的类中

MVC中的优秀设计遵循单一责任原则,即对象的责任应该非常有限。因此,如果您的类需要用户服务,但某些函数不需要用户服务,那么这些函数究竟在做什么,这将是相同职责的一部分

无论如何,当使用依赖项注入时,依赖项应该是便宜的。它们不应该在构造函数中执行任何实际工作,而应该只在使用时进行初始化。这样,即使您有一个不用于特定方法的依赖项,开销也不是很高


话虽如此,您可以在运行时进行任意数量的优化。例如,您可以将Ninject配置为在各种条件下不实例化某些依赖项,因此您可以说,当当前操作为Foo时,不要创建用户服务,即使它具有依赖性。

如果您真的想延迟创建
IUserService
,您可以添加然后构造函数注入
函数安装一个类是非常便宜的(当然,除非您在构造函数中做了大量工作,但可以懒散地完成)。从长远来看,明智的注射只会带来更多的问题。只需插入一个
Lazy
,其中
T
是您的服务。谢谢。我将看一下这个,我应该注意,实例化整个对象图通常是web应用程序中唯一的好做法。在其他应用程序中,如长时间运行的桌面或windows服务,实例化整个图形可能会让人望而却步,浪费资源,更不用说你需要更精细地管理对象生命周期,因为应用程序运行时间很长。@Erik Funkenbusch是的,我认为这个问题有点争议。在启动时即时创建有正反两方面。较长的启动时间和浪费资源肯定是不利因素。在oder端,在绑定无效的情况下更快的反馈是一个优势。我仍然相信每个人都必须做出自己的选择。嗯,在很多情况下,这是非常糟糕的。。例如,EF上下文设计为在使用后立即销毁。如果您注入这些,您希望在每次执行操作时创建它们,而不是在应用程序启动时创建它们。你可以说你有多个合成根,并且这些根是根据需要动态创建的,你完全正确地理解了efcontext/UnitOfWork/Sessions。它们需要有一个更为“范围化”的生存期,即使是在一个遵循单一组合根的应用程序中也是如此。然而,我不同意你关于“多成分根合理化”的观点。组合根的一点是,它定义了如何映射类型,并基本上配置了应用程序。使用UnitOfWork与此无关。我没有说过UnitOfWork。合成根不仅仅是定义映射,它是对象图的根。。在对象图的组成的根中。如果要有多个对象图,则需要多个合成根。
    public HomeController()
    {
    }

    public ActionResult SomeMethod(IUserService userService)
    {
        userService.DoSomething();
       return View();
    }
Func<IUserService> _userServiceFactory;

public HomeController(Func<IUserService> userServiceFactory)
{
    _userServiceFactory= userServiceFactory;
}

public ActionResult SomeMethod()
{
    IUserService userService = _userServiceFactory();
    userService.DoSomething();
   return View();
}

public ActionResult SomeOtherMethod()
{
    //I don't use the service here
   return View();
}