Приведет ли IoC к слишком большому количеству параметров для конструктора контроллера ASP.NET MVC? - PullRequest
3 голосов
/ 16 мая 2009

Я решил использовать ASP.NET MVC для проекта веб-сайта и хочу следовать некоторым лучшим рекомендациям, о которых пишется.

Итак, я разделил Домен / Модель на отдельный проект, создал IRepositories и конкретные репозитории и теперь обратил мое внимание на Castle Windsor как IoC .

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что для конкретного контроллера в конструкторе мне теперь придется передавать несколько параметров IRepository.

Мои вопросы:

  1. Возможно, я создал слишком много репозиториев - в общем, я отображаю 1 репозиторий в 1 класс сущностей в 1 таблицу базы данных. Должны ли мои репозитории содержать более одной таблицы сущностей / БД?
  2. Я пропустил момент с IoC и Dependency Injection, и не должен ли я беспокоиться о том, как параметры передаются в конструктор Controller?

Чтобы дать какой-то контекст. На части веб-сайта будет отображаться карта свойств Google, в которой можно искать по типу недвижимости (замок, дом, паб и т. Д.), местоположение (почтовый индекс, город), * ​​1027 * время открытия и т. Д. Таким образом, все эти компоненты для поиска являются отдельными сущностями PropertyType, Address.City, Address.Postcode.Lat + Long, OpeningTime.DateTime. Следовательно, есть также 3 отдельных репозитория, которые необходимо передать в конструктор SearchController.

Это простой пример, но я могу предположить, что в будущем многие другие параметры хранилища будут передаваться в другие контроллеры.

Надеюсь, все это имеет смысл.

Спасибо за любые ответы или советы.

1 Ответ

3 голосов
/ 16 мая 2009

Меня не волнует, сколько параметров вы передаете в ваш конструктор, IoC будет обрабатывать всю логику этого.

Если у вашего контроллера слишком много параметров, я бы посмотрел, как нарушить функциональность ваших контроллеров, или, возможно, перенесу логику в класс обслуживания.

Что касается репозиториев, я обычно использую универсальный репозиторий, который будет использовать одну сущность в своей реализации. Затем у меня есть класс обслуживания, который объединяет эту информацию в логические единицы. В этом случае вашему контроллеру нужен только доступ к сервису. Например:

interface IRepository<T>
{
    IQueryable<T> GetAll();
    T GetOne(int id);
    void Save(T item);
    void Delete(T item);
}

class OrderService
{
    public OrderService(IReopository<Order> orderRepository, IRepository<OrderDetail> orderDetailRepository, IRepository<Payment> paymentRepository, etc) { }

    public Order CreateOrder(List<OrderDetails> details)
    {}
    // .. other aggregate methods
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...