Зарегистрируйте .net MVC3 ControllerContext в контейнере Windsor - PullRequest
3 голосов
/ 21 декабря 2010

С ASP.NET MVC3, что было бы лучшим способом для регистрации запросов ControllerContext в контейнере Castle Windsor? В конечном счете, я бы хотел сказать

container.Resolve<ControllerContext>();

и вернуть контекст контроллера запросов.

Подробнее

Подавляющее большинство моих действий будут проходить некоторую проверку, аутентификацию и т. Д. Перед отправкой сообщения на nservicebus для фактического выполнения работы. Чтобы избежать необходимости копировать / вставлять эти 20/30 строк кода повсеместно, я поместил их в класс-обработчик, от которого мои контроллеры получают зависимость в конструкторе, тогда действия вызывают этот класс, который оставляет мои действия, содержащие только один строка кода.

Один из дочерних классов, который составляет обработчик, должен знать о пройденном маршруте, я мог бы просто передать контроллер обработчику, а затем в этот класс, но он кажется немного грязным. Было бы неплохо, если бы был способ зарегистрировать Виндзор и предоставить его мне.

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Я не думаю, что вы можете зарегистрировать ControllerContext без каких-либо очень отвратительных взломов, и ИМХО, в любом случае, это не очень хорошая идея. ControllerContext принадлежит контроллеру, он не предназначен для совместного использования.

Однако, если вам нужна только информация о маршрутизации, вы можете зарегистрировать ее следующим образом (НЕПРОВЕРЕНО!):

container.Register(Component.For<HttpContextBase>()
                    .UsingFactoryMethod(() => new HttpContextBaseWrapper(HttpContext.Current))
                    .LifeStyle.PerWebRequest,
                   Component.For<RouteData>()
                    .UsingFactoryMethod(k => RouteTable.Routes.GetRouteData(k.Resolve<HttpContextBase>()))
                    .LifeStyle.PerWebRequest);

Также см. ASP.NET MVC & Windsor.Castle: работа с HttpContext-зависимыми службами для получения более подробной информации.

Я не знаю конкретно, чего вы пытаетесь достичь, но я бы вместо этого изучил это с помощью фильтров или пользовательских ActionResults.

0 голосов
/ 21 декабря 2010

Не совсем ответ на первоначальный вопрос, но я не выношу сомнительных архитектурных решений :) Мне кажется, что ControllerContext не лучшее (ну, даже не хорошее) место, из которого можно попытаться расширить. ModelBinder и ActionAttributes - это места, которые помогут в повторении кода. Они могут самостоятельно сопоставлять, связывать и проверять модели, освобождая контролеров от этой ответственности.

Ну, в общем, что вы действительно хотите сделать, так это использовать Dependency Injection для самих контроллеров, внедряющих сконфигурированные экземпляры несколько IAuthenticationService и IValidationService (их конкретные реализации содержат все эти 20/30 многократно используемых строк кода). Затем в контроллерах вы просто вызываете их в одной строке кода (или даже используете функцию глобальных фильтров MVC3, чтобы сделать это полностью прозрачным).

...