MVC - Создание фабрики контроллеров Windsor Castle - Для этого объекта не определен конструктор без параметров - PullRequest
1 голос
/ 02 декабря 2010

Я ввожу DI в свое приложение MS MVC, и у меня возникают проблемы с созданием экземпляров контроллеров из моей собственной фабрики контроллеров.Кажется, переопределенный «GetControllerInstance» не вызывается.

Может кто-нибудь сказать мне, что мне не хватает?

Моя фабрика контроллеров:

public class WindsorControllerFactory : DefaultControllerFactory
{
    public WindsorControllerFactory()
    {
        var controllerTypes = from t in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())
                              where typeof (IController).IsAssignableFrom(t)
                              select t;
        foreach (Type controllerType in controllerTypes)
        {
            ApplicationContainer.Container.AddComponentLifeStyle(controllerType.FullName, controllerType,
                                                                 LifestyleType.Transient);
        }
    }

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        if(controllerType !=null)
        {
            return (IController) ApplicationContainer.Container.Resolve(controllerType);
        }
        return base.GetControllerInstance(requestContext, controllerType);
    }
}

}

Application_Start:

ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory());
    }

Создана фабрика контроллеров, но может показаться, что она не используется для разрешения контроллера.Я поместил точку останова в 'GetControllerInstance', но она никогда не ударилась.

В результате для этого объекта не определен конструктор без параметров.сгенерировано исключение

обновление:

Я изменил GetControllerInstance следующим образом:

 private WindsorContainer _container;

    public WindsorControllerFactory(WindsorContainer container)
    {
        _container = container;
        _container.Register(AllTypes.Of<IController>().FromAssembly(
      typeof(BaseFactoryController).Assembly).Configure(
          c => c.Named(c.Implementation.Name.ToLowerInvariant()).LifeStyle.Transient));
    }

Теперь я должен игнорировать null controllerType ?!Если это не прокомментировано:

// base.GetControllerInstance (requestContext, controllerType);

Он начинает обрабатывать мои файлы .js как контроллер.Который выбрасывает httpException

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            return null;
        }
        //base.GetControllerInstance(requestContext, controllerType);
        return (IController) _container.Resolve(controllerType);
    }  

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

См. Создание WindsorContainer приводит к ошибке преобразования типов (не совсем тот же вопрос, но, тем не менее, тот же ответ)

0 голосов
/ 02 декабря 2010

Другая проблема, с которой вы можете столкнуться, заключается в том, что этот вызов:

AppDomain.CurrentDomain.GetAssemblies()

... не будет извлекать все доступные контроллеры, если сборки фактически не были загружены в домен приложений.AppDomain загружает сборки, когда они необходимы, поэтому, если вы явно не вызвали их в коде, они не будут загружены.

...