Я ввожу 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);
}