Во-первых, я должен сказать, что я знаю, что это очень близкий вопрос, который я нашел в stackoverflow, но мой вопрос немного другой.
У меня есть n-уровневое приложение в asp .net mvc, в котором у меня есть:
Проект BOL (в котором есть классы EF, объект db и т. Д.),
Проект BLL (который имеет бизнес-логику),
чем у нас есть проект DAL (который имеет логику взаимодействия с базой данных и использует EF dbcontext из BOL).
И основной проект mvc, который включает контроллеры, представления и т. д.
Теперь, мы используем шаблон репозитория, у нас есть много репозиториев в BLL с их интерфейсами. А также у нас есть много репозиториев в DAL, но без интерфейсов. Но во всех этих репозиториях DAL есть один член DbContext, который создается в их конструкторах, поэтому каждый репозиторий DAL взаимодействует с отдельным экземпляром DbContext, который он создал. Strong >
В нашем основном проекте mvc мы использовали ninject для внедрения репозиториев BLL в конструкторы контроллеров (в области запроса). Теперь проблема, с которой мы сталкиваемся, заключается в том, что каждый репозиторий BLL имеет ссылки на один или несколько репозиториев DAL, а каждый из этих репозиториев DAL использует свой собственный отдельный DbCOntext. Это неправильно и плохо, поэтому я ищу способ поделиться одним DbCOntext во всех репозиториях DAL для каждого запроса (независимо от того, сколько репозиториев BLL вводит в мой контроллер, просто убедитесь, что создается и используется только один экземпляр DbContext по запросу). И удаляйте этот контекст после каждого запроса.
Один из способов, который я думал, заключался в том, чтобы не создавать DBcontext в конструкторе репозиториев DAL. Но имейте для этого вызов какого-нибудь метода (скажем, initiateDbContext), чем также добавьте этот метод в репозитории BLL, которые ничего не делают, кроме вызова метода smae своих репозиториев DAL. Вызовите этот метод для одного репозитория BLL в конструкторе контроллера, а затем получите метод для получения и установки контекстов базы данных во всех других репозиториях из первого репозитория. Но я знаю, что это плохой подход, во-первых, мы создаем DbContext в контроллере, который должен быть только в DAL, во-вторых, я добавляю методы create, get и set DbCOntext в DAL, а также в репозитории BLL, потому что мне нужно передать DbCOntext в BLL, который передаст это в репозитории DAL, с которыми он общается внутри. И это очень плохо.
Вот почему я прошу здесь любой хороший шаблон для достижения «ОДИН DBCONTEXT НА ЗАПРОС НА N-УРОВНЕ С ШАБЛОНОМ РЕПОЗИТОРИИ».