ASP.NET使用ControllerFactory
實例點播你的控制器。這個類需要你的控制器有一個無參數的構造函數,它可以用來創建它的一個實例。
您需要使用依賴注入框架來創建控制器並注入所需的依賴關係。 ASP.NET has some dependency injection capability,但我知道它是有缺陷的。我建議使用Castle Windsor來管理你的依賴注入。它與ASP.NET集成得非常好,並且有一個關於集成它的教程here。
如果你沿着這條路走下去,你最終與你的控制器和服務的安裝程序:
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。
您是否在使用Castle Windsor這樣的IoC容器? –
不,我不使用任何Ioc容器 –