0

Я создаю приложение MVC3, используя Entity Framework. В приложении мои контроллеры разговаривают с сервисным слоем. Один из контроллеров - TournamentController, который использует TournamentService. Эта услуга имеет некоторые стандартные методы, такие как CreateTournament, UpdateTournament и т. Д.EF4.3 инъекция зависимостей при создании новых объектов самостоятельно

Когда я хочу вставить новый турнир, я хочу, чтобы в представлении был раскрывающийся список возможных видов спорта, для которых может быть организован турнир. Поэтому в методе TournamentController'sCreate я заполняю 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 поэтому я полагаю, что это немного избыточна, чтобы сделать это класс атрибут.

ответ

1

Держите его простым, введите ISportService в контроллер и позвоните по телефону sportService.GetSports() прямо с контроллера!

+0

Ну, это то, что я изначально имел, но я чувствовал, что наличие двух сервисов в одном контроллере было менее чистым, чем один вызов службы другому. Поскольку я только начинаю использовать эти сервисные слои и репозитории, я не уверен, что это просто личное чувство или плохая практика. – Mekswoll

1

Ваше последнее решение действительно. Внесите необходимый сервис как часть конструктора.

И если вы беспокоитесь о нескольких контекстах, не допускайте создания двух отдельных контекстов.

В вашем Ninject связывания:

Bind<ITournamentRepository>().To<TournamentRepository>().InRequestScope(); 

См https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope

Последняя часть является важной частью. Он создаст только один экземпляр TournamentRepository для текущего запроса. Любые другие пользователи TournamentRepository получат этот экземпляр.

Если вы уже это сделали, вы настроены, иначе просто добавьте InRequestScope, и все готово. (имея в виду, вам понадобится ссылка на Ninject.Web.Common)

Надеюсь, что это поможет.

EDIT:

Remo правильно, я бы не назвал это от службы либо.Просто позвоните для поиска данных из контроллера и заполните свою модель просмотра. Совет InRequestScope по-прежнему сохраняется.

+0

Благодарим вас за совет 'InRequestScope', я неправильно предположил, что ninject автоматически сделает это. – Mekswoll

Смежные вопросы