Ninject.MVC3, передать DependencyResolver на уровень службы?

В приложении 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 не нуждается в репозитории категорий. Я считаю, что это бесполезная трата и нелогично создавать его без необходимости. Я что-то упустил?

10
задан Remo Gloor 16 July 2011 в 21:45
поделиться