【问题标题】:Castle Windsor with MVC 2.0 and Areas带有 MVC 2.0 和区域的温莎城堡
【发布时间】:2012-10-07 05:11:19
【问题描述】:

想问一个关于温莎城堡和为区域控制器实施 IoC 的快速问题。 Castle 2.5 是否支持 MVC 2.0 区域?

我的 Castle 配置适用于我网站根目录中的根控制器,但找不到任何区域控制器

IControllerFactory 'XXX.Castle.WindsorControllerFactory' 没有返回名称为 'Registration' 的控制器。

我不是通过 MvcContrib 直接使用 Castle

代码如下:

class WindsorControllerFactory : DefaultControllerFactory
{
    WindsorContainer container;
    // The constructor:
    // 1. Sets up a new IoC container
    // 2. Registers all components specified in web.config
    // 3. Registers all controller types as components
    public WindsorControllerFactory()
    {
        // Instantiate a container, taking configuration from web.config
        container = new WindsorContainer();

        // Also register all the controller types as transient
        var controllerTypes =
            from t in Assembly.GetExecutingAssembly().GetTypes()
            where typeof(IController).IsAssignableFrom(t)
            select t;
        foreach (Type t in controllerTypes) {
            //container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
            container.Register(Component.For(t).Named(t.FullName).LifeStyle.Transient);
        }

        container.Install(new WindsorInstaller());
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType != null)
        {
            return (IController)container.Resolve(controllerType);
        }

        return null;// base.GetControllerInstance(requestContext, controllerType);
    }
}

非常感谢

理查德

【问题讨论】:

  • 您使用的是什么 WindsorControllerFactory?如果是自定义的,请发布代码。如果是 MVCContrib,是什么版本?
  • 你是如何注册控制器的?
  • 更新了关于以前 cmets 的问题.. 感谢 Mauricio

标签: asp.net-mvc-2 castle-windsor


【解决方案1】:

对于将来遇到此问题的人,我有一个解决方案可以解决我的问题。问题是我的控制器没有为它们所在的目录分配正确的命名空间..

即我有 tsd.Web.Controllers 而不是 tsd.Areas.Account.Controllers

设置命名空间路径以映射目录结构解决了我的问题,然后城堡可以将控制器定位在该区域...!

问候

理查德

【讨论】:

  • 嗨,理查德,我也面临同样的问题。您能否提供更多有关如何设置命名空间路径以映射目录结构的详细信息?非常感谢
【解决方案2】:

可以返回任意一个Controller,之后就可以得到异常404

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType != null)
        {
            return (IController)container.Resolve(controllerType);
        }

        return (IController)container.Resolve(typeof(HomeController));
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多