Внедрение класса уровня доступа к данным в класс бизнес-уровня

#c# #asp.net #.net #asp.net-mvc

#c# #asp.net #.net #asp.net-mvc

Вопрос:

Я нахожусь в процессе переноса всех кодов бизнес-логики в класс бизнес-уровня с моего контроллера в проекте .net MVC4. Итак, мне нужно получить доступ к классу уровня доступа к данным с бизнес-уровня. Структура файла выглядит следующим образом.

Контроллер

 private readonly ICandidateRepository _candidateRepository;
private readonly IJobApplyService _jobApplyService;
public CandidateController(ICandidateRepository candidateRepository, IJobApplyService jobApplyService
{
  _candidateRepository = candidateRepository;
  _jobApplyService = jobApplyService;
}
  
  

Бизнес-уровень

 private readonly ICandidateRepository _candidateRepository;
public JobApplyService(ICandidateRepository candidateRepository)
{
        _candidateRepository= candidateRepository;
}
  

Класс доступа к данным

 CandidateRepository
  

Я могу достичь этого с помощью Ninject DI. но проблема в том, что в моем контроллере для каждого HTTP-запроса создаются 2 экземпляра класса доступа к данным CandidateRepository.

Как я могу это предотвратить?

Есть ли какой-либо другой хороший подход для этого?

Комментарии:

1. Как ICandidateRepository настроен для внедрения зависимостей? Если это для каждого запроса, я бы подумал, что один и тот же экземпляр будет использоваться совместно между контроллером и бизнес-уровнем. Однако я бы рекомендовал вообще не обращаться напрямую к репозиторию в контроллере. Поскольку у вас есть службы бизнес-уровня, они в идеале будут посредником между контроллером и уровнем данных.

2. @MattU ICandidateRepository настроен для использования по запросу. не могли бы вы рассказать мне, как совместно использовать один и тот же экземпляр между контроллером и бизнес-уровнем?

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

Ответ №1:

Вам нужно изменить код в объявлении интерфейса

 private readonly ICandidateRepository _candidateRepository;
public JobApplyService(CandidateRepository candidateRepository)
{
        _candidateRepository= candidateRepository;
}
  

как контроллер места, так и бизнес-уровень

«Кандидатское хранилище candidateRepository»

Комментарии:

1. Принятие конкретной реализации создает связь, в данном случае, между JobApplyService и CandidateRepository . Кроме того, этот ответ не касается того, что задают вопросы.

2. Как этот ответ решает мою проблему. Я не понимаю.