温莎城堡与MVC 2.0和地区

时间:2010-09-17 21:39:22

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

想要问一个关于城堡windsor的快速问题,并为区域中的控制器实施IoC。 Castle 2.5是否支持MVC 2.0领域?

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

IControllerFactory'XX.Castle.WindsorControllerFactory'未返回名称为“Registration”的控制器。

我直接使用Castle而不是通过MvcContrib

代码如下:

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

非常感谢

理查德

2 个答案:

答案 0 :(得分:2)

对于那些在未来遇到这个问题的人,我有一个解决方案来解决我的问题。问题是我的控制器没有为他们所在的目录分配正确的命名空间..

即我有tsd.Web.Controllers NOT tsd.Areas.Account.Controllers

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

此致

理查德

答案 1 :(得分:0)

您可以返回任何Controller,然后可以获得异常404

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

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