Как получить доступ к внедренным сервисам в частичном DbContext OnConfiguring?C#

Место общения программистов C#
Anonymous
Как получить доступ к внедренным сервисам в частичном DbContext OnConfiguring?

Сообщение Anonymous »

При создании шаблона DbContext с помощью dotnet ef dbcontext scaffold инструмент создает частичный класс. Затем я создаю другую частичную реализацию DbContext для реализации OnConfiguring (необходимо передать --no-onconfiguring).
Однако теперь я хочу получить доступ к службе из DI внутри метода OnConfiguring, а именно IHttpContextAccessor.
Что бы я сделал при использовании подхода «сначала код» (без частичных классов), это внедрил бы IHttpContextAccessor в конструктор DbContext, сохраните его в закрытом поле только для чтения и используйте в методе OnConfiguring.
Похоже, это также работает с частичным DbContext. Мне пришлось сделать поле обнуляемым только потому, что пустой конструктор, сгенерированный шаблоном, не назначил его, выдав предупреждение.
Моя полная реализация выглядит так:

Код: Выделить всё

// Partial DbContext generated by scaffolding
public partial class MyContext : DbContext
{
public MyContext(DbContextOptions options)
: base(options)
{
}

// Rest of the scaffolded context ...
}

// My partial DbContext
public partial class MyContext : DbContext
{
private readonly IHttpContextAccessor? _httpContextAccessor;

public MyContext(
DbContextOptions options,
IHttpContextAccessor httpContextAccessor)
: base(options)
{
_httpContextAccessor = httpContextAccessor;
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// Use HttpContext to determine connection string
}
}
Мой вопрос заключается в том, правильно ли это сделать? Я не понимаю, как DI выбирает правильный конструктор в этом случае.
Я также видел, что в DbContext есть метод с именем GetService, но когда я попытался использовать его в OnConfiguring, я получил исключение, сообщающее, что контекст еще не полностью настроен.
Заранее спасибо.

Вернуться в «C#»