2013-01-03 75 views
9

我创建使用MVC 4最佳实践的依赖注入

我想用Ninject设置依赖注入在ASP.net一个新的项目。但在开始设置依赖注入的最佳实践之前,我需要做什么?

目前我在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方法来使用的确切需要依赖性,而不是所有注册在应用程序启动。从控制器

示例代码:

Public ActionResult Get (int id) 
{ 
    var repository = Binder.GetImplementation<IDocuments>(); 

    // do some stuff with the repository here 
} 

不知道这将是一个很好的方法吗?任何建议都会很好。

+4

一些代码,将是一件好事呢? – BenjaminPaul

+1

@Wiktors下面的答案是要走的路。尽可能多地使用构造函数注入。如果出于某种原因,您无法设置完整的依赖关系链,请仅使用SL反模式。 –

回答

16

您现在拥有的是服务定位器反模式的示例。 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容器来解析您的控制器。

0

您已链接到控制器内的Binder类实例。它使得你的类不可重用,它必须被重构,因为控制器不能获得正确的IDocuments实现实例。 必须有一些外部依赖解析器(比如示例 - Ninject)必须进行构造函数注入或属性注入。