通过IOptions配置EF核心上下文

时间:2020-10-26 19:45:24

标签: c# .net-core dependency-injection entity-framework-core

我有一个使用DI和.NET Core选项模式的自定义工作流组件,包括到支持数据库的连接字符串。我正计划添加EF Core,以对同一数据库进行一些数据访问,并希望使用已经通过$.get(file, { name: "John", time: "2pm" , _:Date.now()}, function (data, status) 设置的连接字符串,但是在内部使用时,我遇到了将连接字符串连接到EF的问题配置DbContext,因为在尝试调用services.AddWorkflowEngine()时尚未设置连接字符串。

是否有合适的位置设置EF核心,以便可以通过`AddWorkflowEngine()在内部设置连接字符串?

WorkflowEngine.cs

AddDbContext<T>()

Extensions.cs

public class WorkflowEngine<TScheme> where TScheme : WorkflowScheme
{
  public WorkflowEngine(IOptions<WorkflowConfigurationOptions<TScheme>> options)
  {
     this.connectionString = options.ConnectionString;
  }
}

1 个答案:

答案 0 :(得分:1)

根据@Nkosi的评论,如果我想完成此操作,则我必须将我的DbContext通用化才能注入IOptions<WorkflowConfigurationOptions<T>>,这将在此时引入过多的复杂性。

我最终手动调用了委托。

public static IServiceCollection AddWorkflowEngine<TScheme>(this IServiceCollection services, 
                   Action<WorkflowConfigurationOptions<TWorkflowScheme>> optionsAction) 
                   where TScheme : WorkflowScheme
{
  service.TryAddScoped<WorkflowEngine<TScheme>>();
  // manually invoke action
  var options = new WorkflowConfigurationOptions<TScheme>();
  optionsAction.Invoke(options);
  services.AddDbContext<WorkflowDbContext>(dbOptions=> 
                dbOptions.UseSqlServer(options.ConnectionString);

  services.Configure(optionsAction);
  return services;
}