В приложении MVC3 с Ninject.MVC 2.2.0.3 ( после слияния ) вместо того, чтобы вводить репостории непосредственно в контроллеры Я пытаюсь создать сервисный слой, содержащий бизнес-логику, и вставить туда репосты. Я передаю ninject-DependencyResolver на уровень обслуживания как динамический объект (поскольку я не хочу ссылаться на mvc или ninject). Затем я вызываю GetService для получения репозиториев с привязками и временем жизни, указанными в NinjectHttpApplicationModule. РЕДАКТИРОВАТЬ: Короче говоря, это не удалось.
Как в этом случае IoC-контейнер может быть передан на уровень сервиса? (Разные подходы также приветствуются.)
РЕДАКТИРОВАТЬ : Вот пример, чтобы проиллюстрировать, как я понимаю ответ и комментарии.
Я должен избегать паттерна локатора службы (анти) ] и вместо этого используйте внедрение зависимостей. Допустим, я хочу создать админ-сайт для продуктов и категорий в Northwind. Я создаю модели, репозитории, сервисы, контроллеры и представления в соответствии с определениями таблиц. На этом этапе службы обращаются непосредственно к репозиториям, никакой логики здесь нет. У меня есть основные функциональные возможности, и в представлениях отображаются необработанные данные. Эти привязки настроены для NinjectMVC3: Чтобы отобразить раскрывающийся список категорий в Product / Edit, я создаю ViewModel, который содержит категории в дополнение к Product:
public class ProductViewModel
{
public Product Product { get; set; }
public IEnumerable Categories { get; set; }
}
ProductsService теперь нужен репозиторий категорий для его создания.
private readonly ICategoryRepository _categoryRepository;
// Changed constructor to take the additional repository
public ProductsServiceEx(IProductRepository productRepository,
ICategoryRepository categoryRepository)
{
_productRepository = productRepository;
_categoryRepository = categoryRepository;
}
public ProductViewModel GetProductViewModel(int id)
{
return new ProductViewModel
{
Product = _productRepository.GetById(id),
Categories = _categoryRepository.GetAll().ToArray(),
};
}
Я изменяю действие GET Edit на ] return View (_productsService.GetProductViewModel (id));
и Edit-view, чтобы показать раскрывающийся список:
@model Northwind.BLL.ProductViewModel
...
@Html.DropDownListFor(pvm => pvm.Product.CategoryId, Model.Categories
.Select(c => new SelectListItem{Text = c.Name, Value = c.Id.ToString(), Selected = c.Id == Model.Product.CategoryId}))
Одна небольшая проблема с этим, и причина, по которой я сбился с пути с Service Locator, заключается в том, что ни один из других методов действий в ProductController не нуждается в репозитории категорий. Я считаю, что это бесполезная трата и нелогично создавать его без необходимости. Я что-то упустил?