Как я могу загрузить несколько фабрик контроллеров и передать управление следующему?

Я создал универсальную фабрику контроллеров для загрузки сущностей из базы данных путем анализа 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));
Другие вопросы по тегам