Как я могу загрузить несколько фабрик контроллеров и передать управление следующему?
Я создал универсальную фабрику контроллеров для загрузки сущностей из базы данных путем анализа URL:
entity/products/123456.htm
Однако я хотел бы иметь возможность загружать реальный контроллер, если сущность не найдена, или переопределять поведение сущности по умолчанию, если необходимо, путем создания физического контроллера вместо "виртуального", созданного шаблоном URL.
Прямо сейчас, в global.asax.cs я делаю:
ControllerBuilder.Current.SetControllerFactory(typeof(EntityControllerFactory));
Как я могу, либо в EntityControllerFactory
или здесь, в global.asax.cs
передать управление на другую фабрику, если бы я хотел, чтобы схема контроллера / действия MVC взяла верх?
1 ответ
Вы могли бы создать композит IControllerFactory
реализация:
public class EntityControllerFactory : IControllerFactory {
private IControllerFactory defaultFactory = new DefaultControllerFactory();
public IController CreateController(RequestContext requestContext, string controllerName) {
if(needsCustomLogic) {
// do your custom logic here and return appropriate result
} else {
return defaultFactory.CreateController(requestContext, controllerName);
}
}
// same for the other methods on IControllerFactory
}
Это работает, потому что по умолчанию значение ControllerBuilder.Current.GetControllerFactory()
это пример DefaultControllerFactory
,
Вы также можете подумать о том, чтобы сделать вашу фабрику более перспективной (в случае, если новая версия MVC начнет возвращать другой тип из GetControllerFactory
; маловероятно, но это может произойти), получив экземпляр по умолчанию и передав его на ваш завод:
// in Global.asax
var defaultFactory = ControllerBuilder.Current.GetControllerFactory();
ControllerBuilder.Current.SetFactory(new EntityControllerFactory(defaultFactory));