#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. Как этот ответ решает мою проблему. Я не понимаю.