2009-06-05 166 views
5

我应该做些什么?我正在考虑从BaseController继承我的所有控制器。这是否打破了IoC的设计模式?我还应该做些什么呢?IoC和ASP.NET MVC控制器

public class BaseController: Controller 
{ 
    protected ICookieService CookieService { 
     get { 
      return ServiceResolver.Resolve<ICookieService>(new { HttpContext = HttpContext }); 
     } 
    } 
    protected IDateTimeService DateTimeService { 
     get { 
      return ServiceResolver.Resolve<IDateTimeService>(); 
     } 
    } 
    protected ISettingsService SettingsService { 
     get { 
      return ServiceResolver.Resolve<ISettingsService>(); 
     } 
    } 

} 

回答

10

这将是一个简单得多去与构造器注入,并有注入的ControllerFactory为你。如果可以的话,不要使用服务定位器(您的ServiceResolver),如果您可以使用构造函数注入。

有一些关于它的信息上Adding a controller factory to ASP MVC

链接显示了如何StructureMap做到这一点,它看起来像你使用的统一,但它应该是简单的适应。

+1

我同意。您应该只在应用程序的根目录中使用您的类型解析器。如果没有其他原因,而不是如果您需要更改注射器,则无需更改所有代码,只需更改第一个对象即可。在我的应用程序中,唯一知道注入器的地方是Global.asax,甚至在那里我使用了太多的地方(即,我在2个地方使用它)。使用构造函数注入,所有东西都落在原地而你的物体是绝对的一切 – Talljoe 2009-06-05 02:34:07

0

我假设你有保护的接口是控制器的依赖。可以设置一个IoC容器来为你注入依赖关系。这当然可以与温莎城堡完成。只要IoC容器知道它可以注入的其他服务,就需要将BaseController类更改为具有所需依赖项的构造函数。

0

一个背后Inversion of ControlComponent-Driven Development原则是约使用静态服务定位器时,才会有(在Web服务主机或对象的数据源即:)没有别的办法

从技术上讲,使用静态服务定位器的基本控制器不违反IoC的,它只是不使用它。

检查Autofac IoC容器和ASP.NET MVC之间出existing integration(其他容器必须能够做到这一点为好)。