В ответе "nekno" (отвечено 30 сентября в 22:19) есть две альтернативы ViewModel, которая либо возвращает IEnumerable , либо IEnumerable.».Обе эти альтернативы используют репозиторий, но без его фактического создания, поэтому я хотел бы немного расширить пример кода и выбрать второй вариант, то есть класс со свойством, типизированным IEnumerable.':
using Microsoft.Practices.ServiceLocation; // ServiceLocator , http://commonservicelocator.codeplex.com/
using MyOwnRepositoryNameSpace; // IRepository
public class EditViewModel
{
public int? FooType { get; set; }
public IEnumerable<int?> FooTypes
{
get
{
return Repository.GetFooTypes();
}
}
private IRepository Repository
{
get
{
return ServiceLocator.Current.GetInstance<IRepository>();
}
}
}
Код вышеупомянутого типа с «Поиск зависимости» теперь использует зависимость от библиотеки третьей части, в данном случае библиотеки Common Service Locator.
MyВопрос в том, как заменить вышеприведенный код на «Внедрение зависимостей»?Сама ViewModel действительно очень проста в реализации, просто так:
using MyOwnRepositoryNameSpace; // IRepository
public class EditViewModel
{
private readonly IRepository _repository;
public EditViewModel(IRepository repository)
{
_repository = repository;
}
public int? FooType { get; set; }
public IEnumerable<int?> FooTypes
{
get
{
return _repository.GetFooTypes();
}
}
}
Проблема в том, как заставить ViewModel внедриться с реализацией, когда среда ASP.NET MVC будет создавать экземпляр EditViewModel'и отправьте его в качестве параметра в метод Action, такой как сигнатура метода tihs:
public ActionResult Edit(int id, EditViewModel model) {
// How do we make the framework instantiate the above 'EditViewModel' with an implementation of 'IRepository' when the Action method is invoked ???
Официальный учебник MVC, по-моему, не дает какого-либо приятного решения.В разделе «Обработка изменений» (методы «public ActionResult Edit (...)») на страницах ниже они дублируют создание параметров аналогично тому, как это делается в постере этого вопроса stackoverflow, который вы сейчас читаете.
http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-5
http://mvcmusicstore.codeplex.com/SourceControl/changeset/view/d9f25c5263ed#MvcMusicStore%2fControllers%2fStoreManagerController.cs
Если есть решение о том, как создать модель представления инъекций каркаса с вашими средствами извлечения данных (такими как хранилище), тогда я считаю,это может быть использование некоторой реализации IModelBinderProvider или IModelBinder, но я экспериментировал с ними без реального успеха ...
Итак, кто-нибудь может предоставить ссылку на полный рабочий пример с ASP.NETКод MVC 3, который позволяет внедрить средство извлечения данных в конструктор модели представления, который создается платформой и отправляет в качестве параметра в метод действия?
Обновление 2012-01-01 :Для тех, кто заинтересован в решении этого конкретного вопроса о внедрении конструктора экземпляра ViewModel, когда инфраструктураоценивает его и отправляет в качестве параметра параметра метода действия MVC. Я создал новый вопрос с более конкретной темой и, следовательно, более вероятно, что кто-то с решением найдет его и отправит хороший ответ: Внедрение в конструкторэкземпляра модели представления, используемого в качестве параметра метода Action