Внедрение помощника в DbContext в .net Core - PullRequest
0 голосов
/ 22 октября 2018

Я использую asp.net Core 2.0.И мой DbContext, как показано ниже.AuditHelper - это класс для регистрации всех изменений базы данных.Итак, я ввел AuditHelper в MyDbContext.cs.Но я думаю, что это не правильный путь?Например, когда я создаю экземпляр MyDbContext, я должен указать параметр помощника аудита, например MyDbContext context = new MyDbContext(null);.
. Является ли мой стиль DbContext верным или есть какой-то лучший способ?

public class MyDbContext : DbContext
{
    private readonly IAuditHelper auditHelper;

    public MyDbContext(DbContextOptions<MyDbContext> options, IAuditHelper auditHelper)
        : base(GetOptions())
    {
        this.auditHelper = auditHelper;
    }

    private static DbContextOptions GetOptions()
    {
        return SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), "server=asdf; database=asdf; user id=asdf; password=asdf").Options;
    }

    public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
    {
        var audits = auditHelper.AddAuditLog(base.ChangeTracker);
        return (await base.SaveChangesAsync(true, cancellationToken));
    }
}

1 Ответ

0 голосов
/ 23 октября 2018

Как только контекст и его зависимости зарегистрированы в контейнере

services.AddScoped<IAuditHelper, AuditHelper>();
services.AddDbContext<MyDbContext>(options => 
    options.UseSqlServer("server=asdf; database=asdf; user id=asdf; password=asdf")
);

, нет необходимости инициализировать его (DbContext) вручную.

Контейнер создаст граф объектов при разрешении контекста для внедрения.

Обратите внимание, что статическая функциональность GetOptions может быть перемещена в ConfigureServices при запуске, как показано выше.

Что позволяет контексту оставаться простым.

public class MyDbContext : DbContext {
    private readonly IAuditHelper auditHelper;

    public MyDbContext(DbContextOptions<MyDbContext> options, IAuditHelper auditHelper)
        : base(options) {
        this.auditHelper = auditHelper;
    }

    public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken)) {
        var audits = auditHelper.AddAuditLog(base.ChangeTracker);
        return base.SaveChangesAsync(true, cancellationToken);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...