Как переопределить связыватель модели ASP.NET MVC 3 по умолчанию для разрешения зависимостей (используя ninject) при создании модели? - PullRequest
7 голосов
/ 27 июня 2011

У меня есть приложение ASP.NET MVC 3, которое использует Ninject для разрешения зависимостей.Все, что мне нужно было сделать, это сделать наследующий файл Global от NinjectHttpApplication, а затем переопределить метод CreateKernel для сопоставления моих привязок зависимостей.После этого я могу включить интерфейсные зависимости в конструкторы контроллера MVC, а ninject может их разрешить.Все это замечательно.Теперь я хотел бы также разрешить зависимости в связывателе модели при создании экземпляра моей модели, но я не знаю, как это сделать.

У меня есть модель представления:

public class CustomViewModel
{
    public CustomViewModel(IMyRepository myRepository)
    {
        this.MyRepository = myRepository;
    }

    public IMyRepository MyRepository { get; set; }

    public string SomeOtherProperty { get; set; }
}

У меня тогда есть метод действия, который принимает объект модели представления:

[HttpPost]
public ActionResult MyAction(CustomViewModel customViewModel)
{
    // Would like to have dependency resolved view model object here.
}

Как переопределить связыватель модели по умолчанию, чтобы включить исключение и разрешение зависимостей?

1 Ответ

9 голосов
/ 27 июня 2011

Наличие моделей просмотра зависит от хранилища - это анти-шаблон.Не делай этого.

Если вы все еще настаиваете, вот пример того, как может выглядеть связыватель модели.Идея состоит в том, чтобы иметь пользовательский механизм связывания моделей, в котором вы переопределяете метод CreateModel:

public class CustomViewModelBinder : DefaultModelBinder
{
    private readonly IKernel _kernel;
    public CustomViewModelBinder(IKernel kernel)
    {
        _kernel = kernel;
    }

    protected override object CreateModel(ControllerContext controllerContext, 
      ModelBindingContext bindingContext, Type modelType)
    {
        return _kernel.Get(modelType);
    }
}

, который вы можете зарегистрировать для любой модели представления, для которой вам необходимо выполнить эту инъекцию:

ModelBinders.Binders.Add(typeof(CustomViewModel), 
  new CustomViewModelBinder(kernel));
...