Различные DbContexts для разных ролей пользователей

#c# #.net #entity-framework #architecture

#c# #.net #структура организации #архитектура

Вопрос:

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

Например: У нас есть ApiController с 2 методами:

 [HttpGet, Route("admin"), Authorize(RoleType.Admin)] public Tasklt;...gt; Get(... adminRequest) {  var query = mapperlt;AdminGetCommandgt;(adminRequest);  return mediatr.Send(query); }  [HttpGet, Route(""), Authorize(RoleType.User)] public Tasklt;...gt; Get(... userRequest) {  var query = mapperlt;UserGetCommandgt;(userRequest);  return mediatr.Send(query); }  

после этого каждая команда зависит от разных служб/DbContext и имеет разную конфигурацию. Например:

 //filter for users ... protected override void OnModelCreating(ModelBuilder builder) {  base.OnModelCreating(builder);   builder.ApplyGlobalFilterslt;IDeletedUtcDateTimegt;(e =gt; !e.DeletedUtcDateTime.HasValue);  } ...  //filter for admin  ... protected override void OnModelCreating(ModelBuilder builder) {  ...  base.OnModelCreating(builder);  ... } ...  

Я чувствую, что мне чего-то не хватает, или здесь существует лучшее решение

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

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

2. @JochemVanHespen Пожалуйста, прочитайте более внимательно, все в посте. Нет проблем, просто на вопрос, на который уже ответил Дэвид Браун

Ответ №1:

Можете ли вы объяснить мне, будет ли правильным подходом иметь разный DbContext для разных типов пользователей.

Это разумный подход, если вам нужен другой набор глобальных фильтров запросов (или другие изменения в отображении или поведении) для пользователей. Вы можете просто получить UserDbContext из AdminDbContext или получить оба из базового DbContext и зарегистрировать их отдельно в DI.