我正在使用MVC 4在ASP.net中创建一个新项目。
我想使用Ninject
设置依赖注入。但在我开始设置依赖注入之前,最好的做法是什么?
目前我在webproject中有一个binder类设置,它将引用解决方案中的数据项目。
活页夹类如下所示:
Public static class Binder
{
static Ninject.IKernel _kernel;
static Binder()
{
_kernel = new Ninject.StandardKernel();
_kernel.Bind<IConfig>().To<AppSettingsConfig>();
_kernel.Bind<IDocuments>().To<DocumentsClass.Documents>();
}
public static T GetImplementation<T>()
{
return _kernel.Get<T>();
}
}
然后在我的控制器中,我使用GetImplementation方法来使用确切的require依赖项,而不是在应用程序启动时注册所有依赖项。
来自控制器的示例代码:
Public ActionResult Get (int id)
{
var repository = Binder.GetImplementation<IDocuments>();
// do some stuff with the repository here
}
不确定这是否是一个好方法?任何建议都会很好。
答案 0 :(得分:16)
您现在拥有的是Service Locator反模式的示例。 Google已经多次讨论了更多细节。
简而言之,而不是依赖服务定位器
public class SomeController
{
public ActionResult Get (int id)
{
var repository = Binder.GetImplementation<IDocuments>();
// do some stuff with the repository here
}
}
您应该将服务注入客户端类(依赖于构造函数注入)
public class SomeController
{
private IDocuments documentService { get; set; }
public SomeController( IDocuments documentService )
{
this.documentService = documentService;
}
public ActionResult Get (int id)
{
var repository = documentService;
// do some stuff with the repository here
}
}
在这种特定情况下,您可以设置控制器工厂以使用IoC容器来解析控制器。
答案 1 :(得分:4)
Ninject的最佳实践是使用Ninject的MVC扩展:https://github.com/ninject/ninject.web.mvc/wiki/MVC3
答案 2 :(得分:0)
您链接到控制器内的Binder类的实例。它使您的类不可重用,并且必须重构,因为控制器无法获得正确的IDocuments实现实例。 必须有一些外部依赖解析器(例如--Ninject)必须进行构造函数注入或属性注入。