Как только контекст и его зависимости зарегистрированы в контейнере
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);
}
}