gpt4 book ai didi

c# - 具有 .Net Core Identity 的 Multi-Tenancy DbContext 的 IoC DI

转载 作者:行者123 更新时间:2023-11-30 21:38:03 25 4
gpt4 key购买 nike

我有 .Net Core 应用程序,想使用 .Net Core Identity 为 DbContext 设置 IoC/DI:

public class DataContext : IdentityDbContext<User, IdentityRole<int>, int, IdentityUserClaim<int>, IdentityUserRole<int>, IdentityUserLogin<int>, IdentityRoleClaim<int>, IdentityUserToken<int>>, IDataContext
{
private readonly string _dbName;

public DataContext(string dbName)
{
this._dbName = dbName;
}

public virtual DbSet<Container> Containers { get; set; }

public virtual DbSet<Note> Notes { get; set; }

public virtual DbSet<Post> Posts { get; set; }

public virtual DbSet<Email> Emails { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(ConnectionStrings.DataContext.Replace(":dbname", this._dbName));
base.OnConfiguring(optionsBuilder);
}
}

接口(interface):

public interface IDataContext
{
DbSet<Container> Containers { get; set; }

DbSet<Note> Notes { get; set; }

DbSet<Post> Posts { get; set; }

DbSet<Email> Emails { get; set; }
}

Startup.cs 中,我有以下行:

services.AddDbContext<DataContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DataContext")));

但是该连接字符串不包含数据库名称。

我是否应该在界面中包含以下表格:AspNetUsers、AspNetRoles、...?

我想在 Startup.cs 中编写类似这样的内容:

services.AddScoped<IDataContext, DataContext>();

并且到处使用接口(interface)而不是整个类。

我可以吗?我该怎么做?

最佳答案

当您使用 Entity Framework 的 AddDbContext 方法时,它会为您在服务集合中注册上下文。

 services.AddDbContext<DataContext>(ServiceLifetime.Scoped);

但是您可以像下面这样注册您的接口(interface)。

services.AddScoped(typeof(IDataContext), provider => provider.GetService<DataContext>());

然后你就可以使用界面了。但身份服务仍将使用具体类型。


PS:你知道repository pattern吗? ?它使您能够轻松地将数据层与服务层分开。这对单元测试有很大帮助。


DataContext 构造函数的问题是依赖容器不知道如何解析构造函数中的字符串。通常,当您在 asp.net core 中使用配置时,您可以使用 IOptions 类型及其基础结构。

在启动中,您可以添加选项并进行配置。

public class DatabaseOptions
{
public string DbName { get; set; }
}

services.AddOptions();
services.Configure<DatabaseOptions>(options => options.DbName = "myDbName");

然后您可以将 DataContext 的构造函数更改为以下内容。

public DataContext(IOptions<DatabaseOptions> options)

如果您不知道启动时的配置值,您可以编写在中间件或操作过滤器中配置的上下文类型。

public class DbConfigurationContext
{
public string DbName { get; set; }
}

public class DbConfigurationContextFilter : IAsyncActionFilter
{
private readonly DbConfigurationContext _dbConfiguration;

public DbConfigurationContextFilter(DbConfigurationContext dbConfiguration)
{
_dbConfiguration = dbConfiguration;
}

public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
_dbConfiguration.DbName = context.HttpContext.Request.Query["DbName"];
await next();
}
}


services.AddTransient<DbConfigurationContext>();
services.AddTransient<DbConfigurationContextFilter>();
services.AddMvc(setup =>
{
setup.Filters.AddService(typeof(DbConfigurationContextFilter));
})

然后您可以在您的 DbContext 中解析此 DbConfigurationContext。当然,您也可以使用接口(interface)。

public DataContext(DbConfigurationContext configurationContext)

关于c# - 具有 .Net Core Identity 的 Multi-Tenancy DbContext 的 IoC DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46420537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com