ASP.NET 使用 aControllerFactory
按需实例化您的控制器。这个类要求你的控制器有一个无参数的构造函数,它可以用来创建它的一个实例。
您需要使用依赖注入框架来创建控制器并注入所需的依赖。ASP.NET 有一些依赖注入功能,但我知道它有缺陷。我建议使用Castle Windsor来管理您的依赖注入。它与 ASP.NET 集成得很好,这里有一个集成教程。
如果你沿着这条路线走,你最终会得到一个控制器和服务的安装程序:
public class Installer : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());
container.Register(Component.For<IHomeService>.ImplementedBy<HomeService>());
}
}
..还有一个新ControllerFactory
的来创建它们:
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
public WindsorControllerFactory(IKernel kernel)
{
_kernel = kernel;
}
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
}
return (IController) _kernel.Resolve(controllerType);
}
}
最后,您将创建一个容器并设置一个新的控制器工厂:
var container = new WindsorContainer().Install(new Installer());
var controllerFactory = new WindsorControllerFactory(_container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
您也可以使用Ninject或StructureMap。