Первое, что нужно сделать с внедрением зависимостей в пользовательские веб-страницы, это то, что вы не можете использовать конструктор. Жаль, и я надеюсь, что они улучшат это в будущих версиях. Причина этого заключается в том, что фактический класс, который реализует это, динамически генерируется во время выполнения движком ASP.NET.
Таким образом, в настоящее время мы можем использовать только инъекцию свойств.
Так что одна из возможностей - использовать пользовательский IDependencyResolver
. К сожалению, IDependencyResolver не очень хорошо работает с Castle Windsor . Например, с Ninject это был бы кусок пирога. Все, что вам нужно сделать, это украсить свойство SomeHelper
атрибутом [Inject]
:
[Inject]
public ISomeHelper SomeHelper { get; set; }
и он был бы автоматически подключен Ninject, поскольку он использует собственный IDependencyResolver. Боюсь, что с Виндзором вам придется делать это вручную. Таким образом, вы можете сделать свой контейнер общедоступным в Global.asax, а затем:
public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
{
protected WebViewPage()
{
SomeHelper = MvcApplication.WindsorContainer.Resolve<ISomeHelper>();
}
public ISomeHelper SomeHelper { get; set; }
}
Я знаю, что это отстой, но я боюсь, что это суровая реальность. Или, может быть, переключиться на Ninject? Он отлично играет с ASP.NET MVC 3 и его IDependencyResolver
.