У меня есть приложение ASP.NET MVC 3, и я использую Ninject для внедрения зависимостей в мои классы.
Действия на контроллерах передают ViewModels (не содержащие логику) в слой представления.
Когда форма HTTP POSTed, MVC 3 создает экземпляр ViewModel и связывает входящие данные POST со свойствами ViewModel. MVC 3 использует класс DefaultModelBinder для создания экземпляра и выполнения привязки.
Большинство моих моделей ViewModel имеют зависимость, которую я не хочу устанавливать для каждого отдельного метода контроллера (принцип DRY).
Поэтому я создал собственный подкласс DefaultModelBinder следующим образом:
using System;
using System.Web.Mvc;
namespace Application.Classes {
public sealed class CustomModelBinder : DefaultModelBinder {
private readonly IDependencyResolver DependencyResolver;
public CustomModelBinder( IDependencyResolver dependencyResolver ) {
DependencyResolver = dependencyResolver;
}
protected override object CreateModel( ControllerContext controllerContext , ModelBindingContext modelBindingContext , Type modelType ) {
return DependencyResolver.GetService( modelType );
}
}
}
И я установил его для замены DefaultModelBinder следующим образом (в Global.asax.cs):
protected void Application_Start() {
// ...
ModelBinders.Binders.DefaultBinder = new CustomModelBinder( DependencyResolver.Current );
// ...
}
Делая это, когда метод Controller получает ViewModel, он будет построен Ninject с использованием привязки, указанной в моем NinjectModule. ViewModel теперь получает свои зависимости, вставленные в его конструктор.
Это правильное использование шаблона локатора службы?
Разъяснение / ОБНОВЛЕНИЕ: