【问题标题】:BetterCMS won't play nice with Castle Windsor when setting an IControllerFactoryBetterCMS 在设置 IControllerFactory 时不会与 Castle Windsor 配合得很好
【发布时间】:2015-05-25 13:34:18
【问题描述】:

按照 Windsor 的标准 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 不会尊重我的 Windsor 容器。

没有用我自己的来组合 BetterCMS 工厂来创建工厂,我该怎么做才能让这两者发挥得很好?

【问题讨论】:

  • 有什么异常?

标签: c# asp.net-mvc castle-windsor ioc-container bettercms


【解决方案1】:

您可以使用decorator pattern,这样您就不必将它们组合在一起。

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));

查看完整示例here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-22
    • 2015-02-03
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 2010-09-11
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多