Разрешение контроллера MVC с помощью WindsorControllerFactory - PullRequest
2 голосов
/ 12 декабря 2011

Я новичок в Виндзоре, поэтому

Вот мой установщик:

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

}

Все контроллеры, которые наследуются от контроллера, разрешены хорошо. Но когда я пытаюсь создать что-то вроде этого:

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

RestController также наследуется от контроллера

это бросает IControllerFactory 'TheStorage.Web.Factories.WindsorControllerFactory' не вернул контроллер для имени 'Article'

Что я делаю не так?

1 Ответ

1 голос
/ 13 декабря 2011

Ошибка, которую вы получаете, связана с попыткой / ловлей, которую вы установили на заводе. Вы не должны этого делать.

Теперь, скорее всего, происходит то, что ваш контейнер не может разрешить ваш контроллер, вероятно, либо потому, что у него неразрешимые зависимости, либо он не зарегистрирован (возможно, вы поместили его в неправильное пространство имен)?

Как только вы дадите сбой, Виндзор скажет вам точно, в чем проблема.

...