C# mvc5控制器中的Ninject
如果我想使用Ninject在HomeController中创建服务,我可以执行以下操作: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
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();
}