【发布时间】:2019-11-22 09:16:42
【问题描述】:
我正在尝试在运行时添加DbContext。我这样做的原因是因为客户端使用不同的数据库模式。通过这样做,我无法将其添加到 StartUp 的 ConfigureServices 方法中,因为我需要先了解客户端,然后尝试在其中创建具有适当模式的连接字符串,因为每次请求时都会调用 Configure 方法制作。我尝试访问IServiceCollection,但容器显示没有IServiceCollection 类型的服务已注册。我现在尝试在 startUp 的 ConfigureServices 方法中注册 IServiceCollection 本身,然后应用程序拒绝完全启动。有没有更好的方法在运行时添加它?
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceCollection services)
{
// global cors policy
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
app.UseAuthentication();
app.UseMvc();
IClientValidator clientValidator = app.ApplicationServices.GetRequiredService<IClientValidator>();
services.AddDbContext<ClientDbContext>(options =>
options.UseSqlServer(clientValidator.GetConnectionString()));
}
客户端验证器负责解析客户端连接字符串。
【问题讨论】:
-
您可以编写一个工厂并将其注册到运行时返回相应上下文的 DI 容器中。
-
两个客户端是否共享相同的业务逻辑,即使它们具有不同的架构设计?如果不是,那么它们不属于同一个应用程序,如果是,那么您可以使用策略模式在实现之间切换。
-
如果两个客户端的逻辑相同。那么最好只更改连接字符串而不是使用两个 DbContext。
-
好的,我想让我解释一下整个逻辑,以便您明白我的意思。客户端具有不同的模式并且位于不同的数据库中(因为这是大数据应用程序),因此当客户端发出请求(基本上是 url)时,系统会检测到客户端,然后转到另一个知道所有信息的
Dbcontext每个客户端并检索它将连接到的适当数据库和模式,然后配置连接字符串以放入连接。所以另一个DbContext没有和另一个相同的数据库表。 -
哇!非常感谢。我决定像往常一样添加
DbContext,然后我将使用DbContext类的OnConfiguring方法在那里设置连接字符串。但还有一件事,我希望在每个请求上都创建连接字符串。是否可以将DbContext添加为AddTransient<>()?还是每次请求都调用OnConfiguring方法?
标签: c# asp.net-core asp.net-core-webapi