Контроллер фабрики на маршрут - PullRequest
2 голосов
/ 21 января 2012

Я реализовал собственный маршрут (унаследованный от RouteBase), чтобы динамические маршруты основывались на данных, хранящихся в базе данных.После обработки этот маршрут возвращает RouteData, содержащий 1) объект EF 2) действие 3) контроллер

Все работает, как ожидалось, за исключением того, что я хотел бы, чтобы значением контроллера было либо полное имя типа контроллера(Я разрешаю пользователям выбирать его из панели администратора) или слово «Авто».Если выбрано Авто, я использую структурную карту, чтобы найти контроллер, который реализует универсальный Контроллер .Для этого я возвращаю с данными маршрута MvcRouteHandler с фабрикой пользовательских контроллеров, переданной в его конструктор.

После небольшого копания я понял, что MvcRouteHandler не передает эту фабрику контроллеров MvcHandler, которую он создает, поэтому моя фабрика пользовательских контроллеров никогда не вызывается и маршрут всегда терпит неудачу.Я не уверен, какие альтернативы у меня есть, если таковые имеются.Я думаю, что я, возможно, мог бы установить фабрику контроллеров в целом, но я чувствую, что это было бы неправильно, поскольку только запросы, обработанные моими пользовательскими маршрутами, должны иметь фабрику нестандартных контроллеров.

1 Ответ

1 голос
/ 28 января 2012

В итоге следующие работы. Единственная серая точка - это метод ReleaseController, которому платформа не передает RequestContext. Это нормально, потому что все, что делает этот метод, это вызывает dispose на контроллере, если он реализует IDisposible, поэтому реализация по умолчанию в порядке.

   public class RouteControllerFactory : IControllerFactory
{
    private readonly DefaultControllerFactory Default = new DefaultControllerFactory();

    public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
    {
        return (requestContext.RouteData.Values.TryGetValue("controllerfactory") as IControllerFactory ?? Default).CreateController(requestContext, controllerName);
    }

    public System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(System.Web.Routing.RequestContext requestContext, string controllerName)
    {
        return (requestContext.RouteData.Values.TryGetValue("controllerfactory") as IControllerFactory ?? Default).GetControllerSessionBehavior(requestContext, controllerName);
    }

    public void ReleaseController(IController controller)
    {
        Default.ReleaseController(controller);
    }
}

Для регистрации фабрики контроллеров просто используйте ControllerBuilder.Current.SetControllerFactory (TypeOf (RouteControllerFactory));

в Application_Start

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...