当我的团队开始使用依赖注入时,我们正在阅读 Steven Sanderson 的一本好书“ Pro ASP.NET MVC 2 Framework ”。在本书中,他描述了如何使用流行的依赖注入框架Castle Windsor。据我所知,在另一本书“Pro ASP.NET MVC 3 Framework”中,描述了如何使用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();
}
}
还有一个指向 Castle Windsor 文档的链接,您可以在其中找到有关使用生活方式和ASP.NET MVC 3 应用程序教程的更多信息。
** 当你使用接口时
- 在代码中模拟依赖项更容易(一些模拟框架有限制)
- 在不更改旧实现的情况下开发和测试新实现更容易。
** 如果您实现并设置了控制器工厂,则您不需要控制器中的默认构造函数。