【问题标题】:Resolving MVC Controller with WindsorControllerFactory使用 WindsorControllerFactory 解析 MVC 控制器
【发布时间】:2011-12-12 11:38:38
【问题描述】:

我是温莎的新手,所以

这是我的安装程序:

public class ControllersInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(FindControllers().Configure(ConfigureControllers()));
    }

    private ConfigureDelegate ConfigureControllers()
    {
        return c => c.LifeStyle.Transient;
    }

    private BasedOnDescriptor FindControllers()
    {
        return AllTypes.FromThisAssembly()
            .BasedOn<IController>()
            .If(Component.IsInSameNamespaceAs<HomeController>())
            .If(t => t.Name.EndsWith("Controller"));
    }
}

和工厂:

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)
    {
        try
        {
            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);
        }
        catch(Exception ex)
        {
            return null;
        }
    }

}

从 Controller 继承的所有控制器都被很好地解析。但是当我尝试实例化这样的东西时:

public class ArticleController : RestController<Article>
{
    protected override JsonResult Create(Article item)
    {
        ...
    }
}

RestController 也继承自 Controller

它抛出 IControllerFactory 'TheStorage.Web.Factories.WindsorControllerFactory' 没有返回名称为 'Article' 的控制器

我做错了什么?

【问题讨论】:

  • 您是否尝试过为 FindControllers 使用 BasedOn

标签: model-view-controller inversion-of-control castle-windsor ioc-container


【解决方案1】:

您遇到的错误是由于您在工厂中放置的 try/catch 造成的。你不应该那样做。

现在,最有可能发生的情况是,您的容器无法解析您的控制器,可能是因为它具有无法解析的依赖关系,或者它没有被注册(也许您将它放在错误的命名空间中)?

一旦你让它失败,温莎会告诉你到底是什么问题。

【讨论】:

    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 2013-02-02
    • 2013-12-05
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多