當我的團隊開始使用依賴注入時,我們正在閱讀Steven Sanderson的一本好書「Pro ASP.NET MVC 2 Framework」。在本書中,他描述瞭如何使用流行的依賴注入框架Castle Windsor。在另一本書「Pro ASP.NET MVC 3框架」中,據我所知,如何使用Ninject(另一個框架)進行了描述。
爲了使用溫莎城堡:
首先,你必須寫控制器工廠的定製實現:
/// <summary>
/// Controller factory the class is to be used to eliminate hard-coded dependencies
/// between controllers and other components
/// </summary>
public class ControllerFactory : DefaultControllerFactory
{
private readonly IWindsorContainer container;
public WindsorControllerFactory(IWindsorContainer container)
{
this.container = container;
}
public override void ReleaseController(IController controller)
{
container.Release(controller.GetType());
}
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
return (IController)container.Resolve(controllerType);
}
}
然後,你必須寫入所有控制器的安裝程序。
/// <summary>
/// Castle windsor installer for controller components.
/// </summary>
public class ControllersInstaller : IWindsorInstaller
{
/// <summary>
/// Performs the installation in the <see cref="T:Castle.Windsor.IWindsorContainer"/>.
/// </summary>
/// <param name="container">The container.</param>
/// <param name="store">The configuration store.</param>
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Classes.FromThisAssembly()
.BasedOn<IController>()
.LifestyleTransient()
);
}
}
如果你想與依賴你也應該寫一個安裝程序爲他們的倉庫來解決。它將類似於ControllersInstaller,但生活方式將是LifestylePerWebRequest()。 PerRequestLifestyle應該在web.config文件中註冊。
<httpModules>
<add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor" />
</httpModules>
然後,你必須創建容器的一個實例時,應用程序啓動在Global.asax.cs中:
public class MvcApplication : System.Web.HttpApplication
{
private static IWindsorContainer container;
protected void Application_Start()
{
container = new WindsorContainer();
container.Install(FromAssembly.This());
//Set the controller builder to use our custom controller factory
var controllerFactory = new WindsorControllerFactory(container);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}
protected void Application_End()
{
container.Dispose();
}
}
還有一個link到溫莎城堡的文檔,你可以找到更多信息與lifestyles和ASP.NET MVC 3 application tutorial一起工作。
**當您使用接口
- 更容易在你的代碼(有些嘲諷的框架有限制)
- 更容易開發新的實施和測試它沒有在舊的變化模擬依賴。
**如果您已實施並設置了控制器工廠,則不需要控制器中的默認構造函數。