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

Я создал универсальную фабрику контроллеров для загрузки сущностей из базы данных путем анализа URL:

entity/products/123456.htm

Однако я хотел бы иметь возможность загружать реальный контроллер, если объект не найден, или переопределять поведение объекта по умолчанию, если необходимо, путем создания физического контроллера вместо «виртуального», созданного URL-адресом. шаблон.

Прямо сейчас, в global.asax.cs я делаю:

ControllerBuilder.Current.SetControllerFactory(typeof(EntityControllerFactory));

Как я могу, либо в EntityControllerFactory, либо здесь в global.asax.cs, передать управление на другую фабрику, если я бы хотел, чтобы схема контроллера / действия MVC взяла на себя управление?

1 Ответ

3 голосов
/ 23 марта 2011

Вы можете создать составную 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));
...