Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IoC和ASP.NET MVC控制器_C#_Asp.net Mvc_Inversion Of Control - Fatal编程技术网

C# IoC和ASP.NET MVC控制器

C# IoC和ASP.NET MVC控制器,c#,asp.net-mvc,inversion-of-control,C#,Asp.net Mvc,Inversion Of Control,我应该做些类似的事情吗?我想我的所有控制器都继承自BaseController。这是否打破了国际奥委会的设计模式?我还应该做些什么呢 public class BaseController: Controller { protected ICookieService CookieService { get { return ServiceResolver.Resolve<ICookieService>(new { HttpContext

我应该做些类似的事情吗?我想我的所有控制器都继承自
BaseController
。这是否打破了国际奥委会的设计模式?我还应该做些什么呢

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>();
        }
    }

}
公共类BaseController:控制器
{
受保护的ICookieService CookieService{
得到{
返回servicesolver.Resolve(new{HttpContext=HttpContext});
}
}
受保护的IDateTimeService DateTimeService{
得到{
返回servicesolver.Resolve();
}
}
受保护的ISettings服务设置服务{
得到{
返回servicesolver.Resolve();
}
}
}

使用构造函数注入并让controllerfactory为您注入会简单得多。如果可以,请不要使用服务定位器(您的ServiceResolver),如果您可以避免构造函数注入

网上有一些关于它的信息


该链接显示了如何使用StructureMap,看起来您正在使用Unity,但它应该很容易适应。

我假设您拥有的受保护接口是控制器的依赖项。可以设置一个IoC容器来为您注入依赖项。温莎城堡当然可以做到。您需要将BaseController类更改为具有所需依赖项的构造函数,只要IoC容器知道它能够注入的其他服务。

背后的原则之一是,只有在没有其他方法时才使用静态服务定位器。(即:在web服务主机或对象数据源中)

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


在Autofac IoC容器和ASP.NET MVC之间签出(其他容器也应该能够这样做).

我同意。您应该只在应用程序的根目录下使用类型解析程序。如果没有其他原因,除非您需要更改注入器,否则您不必更改所有代码,只需更改第一个对象所在的点。在我的应用程序中,唯一知道注入器的地方是Global.asax,即使在那里,我使用的注入器也太多了位置(也就是说,我在两个位置使用它)。通过构造函数注入,一切都会到位,并且对象与之隔离。我实际上使用了Castle Windsor,但使用了一组包装器接口来隐藏其复杂性/依赖性。