将 AuthenticationStateProvider 传递给 DataContext

问题描述 投票:0回答:0

我正在使用 Blazor Server,我需要向所有数据库记录添加审计信息。

为此,我覆盖了 SaveChanges/SaveChangesAsync 以添加审计细节

        public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
        {
            SetAudit();
            return base.SaveChangesAsync(cancellationToken);
        }
        /// <summary>
        /// Populate the audit part of the db records
        /// </summary>
        /// <returns></returns>
        public override int SaveChanges()
        {
            SetAudit();
            return base.SaveChanges();
        }

        private async Task  SetAudit()
        {
           var state = await _auth.GetAuthenticationStateAsync();
           var userId = state.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value ?? "seed";           
            var tracker = ChangeTracker;

问题是如何让 IOC 将 AuthenticationStateProvider 传递给 DataContext。

        public DataContext(DbContextOptions<DataContext> options, AuthenticationStateProvider auth) : base(options)
        {
            _auth = auth;
        }

它不起作用,因为 DataContext 是从 IDesignTimeDbContextFactory 中创建的

    public class DesignTimeFactory : IDesignTimeDbContextFactory<DataContext>
    {
        public DataContext CreateDbContext(string[] args, AuthenticationStateProvider auth)
        {
            var optionsBuilder = new DbContextOptionsBuilder<DataContext>();
            const string connectionString =
                @"server=localhost\\sqlexpress;database=bedbrigade;trusted_connection=SSPI;Encrypt=False";
            optionsBuilder.UseSqlServer(connectionString);
            return new DataContext(optionsBuilder.Options, auth);
        }
    }
dependency-injection entity-framework-6 datacontext
© www.soinside.com 2019 - 2024. All rights reserved.