如何将现有数据库上下文变量添加到服务

时间:2019-06-14 09:59:33

标签: asp.net

我有ASP.NET核心服务,并且在我们的ConfigureServices(IServiceCollection服务)方法中,我们目前正在执行以下操作:

public void ConfigureServices(IServiceCollection services)
..................................................
services.AddDbContext<DatabaseContext>(options => options.UseSqlServer(connectionString));

但是,我想实现以下目标:

DbContextOptionsBuilder optionsBuilder = new DbContextOptionsBuilder()
.UseSqlServer(connectionString);                
var datbaseContext = new DatabaseContext(optionsBuilder.Options);
services.AddDbContext<DatabaseContext>(use already existinge variable datbaseContext);

如果我写这样的话:

services.AddDbContext<DatabaseContext>(context => new DatabaseContext(optionsBuilder.Options));

代码肯定可以编译,但是我不能在应该使用该上下文实例化的类中使用该上下文,例如

var reminders = new List<IReminder> {new WeeklyReminder(databaseContext), new ApproverReminder(databaseContext)};

是否有一种简单的方法来实现它,或者我做错了什么方法?我记得其他DI容器也有可能

1 个答案:

答案 0 :(得分:0)

好的,我的同事帮助找到了答案。 基本上只需要更改使用这些提醒的服务来创建它自己的作用域并与服务提供者一起使用,因此整个外观如下:

services.AddDbContext<DatabaseContext>(options => options.UseSqlServer(connectionString));
services.AddScoped<IReminder, WeeklyReminder>();
services.AddScoped<IReminder, ApproverReminder>();
services.AddSingleton<IHostedService, EmailSenderHostedService>();

............................................... ............................

public EmailSenderHostedService(IServiceProvider serviceProvider)
{
    _serviceScope = serviceProvider.CreateScope();

........................................

foreach (var reminder in _serviceScope.ServiceProvider.GetServices<IReminder>())