按照温莎的标准MVC 5教程,我创建了一个WindsorControllerFactory
:
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));
}
if (controllerType != null && kernel.HasComponent(controllerType))
return (IController)kernel.Resolve(controllerType);
return base.GetControllerInstance(requestContext, controllerType);
}
我也想开始使用BetterCMS
,我已经得到了正确的Nuget包,并试图在Global.asax
中初始化它:
__CmsHost = CmsContext.RegisterHost();
调用后,当我检查ControllerBuilder.Current.GetDefaultControllerFactory()
时,我有合适的BetterCMS
工厂。
但是要使用Windsor,我需要注册我自己的控制器工厂:
var controllerFactory = new WindsorControllerFactory(__Container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
当然,现在当我尝试访问BetterCMS
控制器时,我得到一个错误-它不识别它需要构建的控制器。
我试过限制容器注册控制器的命名空间,但这并没有改变结果:
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Classes.FromThisAssembly()
.InNamespace("MyNamespace.Net.Web.Platform.Controllers", true)
.LifestyleTransient());
}
我的意思是,微软的SetControllerFactory
不会尊重我的温莎容器。
通过组合BetterCMS工厂和我自己的工厂来创建工厂,我能做些什么来让这两个发挥良好?
你可以使用一个装饰器模式,这样你就不必把它们组合在一起了。
public class ControllerFactoryDecorator : IControllerFactory
{
public ControllerFactoryDecorator(
IControllerFactory controllerFactory
)
{
if (controllerFactory == null)
throw new ArgumentNullException("controllerFactory");
this.innerControllerFactory = controllerFactory;
}
private readonly IControllerFactory innerControllerFactory;
// Implement IControllerFactory members and delegate each
// call to the innerControllerFactory if it doesn't apply here.
}
然后把现有的IControllerFactory
换行。
// Setup the Controller Factory with a decorator
var currentFactory = ControllerBuilder.Current.GetControllerFactory();
ControllerBuilder.Current.SetControllerFactory(
new ControllerFactoryDecorator(currentFactory));