Я создаю приложение MVC3, используя Entity Framework. В приложении мои контроллеры разговаривают с сервисным слоем. Один из контроллеров - TournamentController
, который использует TournamentService
. Эта услуга имеет некоторые стандартные методы, такие как CreateTournament
, UpdateTournament
и т. Д.EF4.3 инъекция зависимостей при создании новых объектов самостоятельно
Когда я хочу вставить новый турнир, я хочу, чтобы в представлении был раскрывающийся список возможных видов спорта, для которых может быть организован турнир. Поэтому в методе TournamentController's
Create
я заполняю ViewBag.Sports
список возможных видов спорта. Теперь, чтобы получить этот список видов спорта, я использую _tournamentService.GetAllSports()
. В этом GetAllSports()
метод TournamentService
Я хочу создать экземпляр SportService
, чтобы я мог «переслать» вопрос в нужную службу.
Все сервисы используют инъекции зависимостей в конструкторе, чтобы ввести свой собственный репозиторий, например:
private ITournamentRepository _repo;
public TournamentService(ITournamentRepository repo) {
_repo = repo;
}
Мой GetAllSports()
метод в TournamentService
выглядит следующим образом:
public IEnumerable<Sport> GetAllSports() {
ISportService sportService = new SportService();
return sportService.GetSports();
}
Проблема заключается в том, что, вызывая new SportService()
, он ожидает, что я передам его ISportRepository
, как в TournamentService
, где ninject создает TournamentRepository
. Теперь я мог бы сделать следующее:
public IEnumerable<Sport> GetAllSports() {
ISportService sportService = new SportService(new SportRepository());
return sportService.GetSports();
}
Но проблема в том, что каждое хранилище ожидает IContext, который обычно обрабатывается Ninject, а также. Кроме того, я не хочу создавать два отдельных контекста.
Возможное решение, которое я нашел себя, чтобы сделать это:
private ITournamentRepository _repo;
private ISportService _sportService;
public TournamentService(ITournamentRepository repo, ISportService sportService) {
_repo = repo;
_sportService = sportService
}
Но есть только один метод в моем TournamentService
классе, который будет на самом деле использовать _sportService
поэтому я полагаю, что это немного избыточна, чтобы сделать это класс атрибут.
Ну, это то, что я изначально имел, но я чувствовал, что наличие двух сервисов в одном контроллере было менее чистым, чем один вызов службы другому. Поскольку я только начинаю использовать эти сервисные слои и репозитории, я не уверен, что это просто личное чувство или плохая практика. – Mekswoll