регистрация DbContext с несколькими параметрами - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь внедрить TenantProvider в DbContext

public class AppDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, long>
{
    public int? _tenantId;

    public ITenantProvider _tenantProvider;

    public AppDbContext(
        DbContextOptions<AppDbContext> options,
        ITenantProvider tenantProvider
        )
    : base(options)
    {
        _tenantProvider = tenantProvider;
    }

но я не понимаю, как правильно его зарегистрировать - если я поставлю точку останова в конструкторе - tenantProvider будет null.

Бит от Startup.cs

services.AddDbContext<AppDbContext>(options => AppDbContextOptionsBuilder.Get());

следующая строка необходима для добавления DbContext в контроллер или службу (если я добавлю ServiceLifetime.Scoped в качестве второго параметра к описанному выше методу - AddDbContext - функция не работает):

services.AddScoped(p => new AppDbContext(AppDbContextOptionsBuilder.Get(), p.GetService<ITenantProvider>()));

(Entity Framework - это отдельный проект в моем решении)


При использовании метода .AddScoped - мы можем передать TenantProvider в конструктор, разрешив его методом .GetService.

Кто-нибудь имеет представление о том, как разрешить TenantProvider в методе .AddDbContext?


Дополнительная информация:

Я пытался заменить ITenantProvider в конструкторе DbContext на IHttpContextAccessor - последний зарегистрирован как синглтон. Но параметр acessor по-прежнему null.

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

1 Ответ

0 голосов
/ 01 июля 2018

Я не совсем понимаю, что должен делать ваш звонок AddScoped. AddDbContext уже правильно зарегистрирует контекст базы данных в коллекции сервисов. Поэтому, когда вы разрешаете контекст посредством внедрения зависимостей, дополнительные зависимости будут автоматически разрешены.

Так что для этого должно быть достаточно:

services.AddDbContext<AppDbContext>(options => …);

services.AddSingleton<ITenantProvider, TenantProvider>();

И затем, вы можете зависеть от вашего AppDbContext, используя инжекцию конструктора, например в ваших контроллерах.


Две заметки:

  1. При настройке параметров вы должны изменить переданный объект параметров. Поэтому вам не нужно просто возвращать AppDbContextOptionsBuilder.Get(), а вместо этого использовать переданный объект параметров и редактировать его.

  2. Вам следует задуматься о том, является ли контекст вашей базы данных зависимым от вашего поставщика-арендатора. Согласно SRP ваша база данных должна делать только одну вещь, а именно обеспечивать доступ к базе данных.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...