单例服务和EF Core dbContext

时间:2019-10-30 04:37:42

标签: c# entity-framework asp.net-core entity-framework-core

该应用程序使用ASP.NET Core3。在第一次调用时,将创建一个项目类服务。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    string connection = Configuration.GetConnectionString("ConnectionDB");
    services.AddDbContext<DataBaseContext>(options => options.UseSqlServer(connection), ServiceLifetime.Transient, ServiceLifetime.Singleton);

    services.AddSingleton<Project>();
}

Project.cs

public class Project
{
    private readonly DataBaseContext _dbContext;

    public Project(DataBaseContext dbContext)
    {
        _dbContext = dbContext;
        Init();
    }   

    public async void Init()
    {
        await SomeMethod('text');
    }

    public async Task SomeMethod(string message)
    {
        _dbContext.Items.Add(message);
        await _dbContext.SaveChangesAsync();
    }
}

这并不完全正确,我想在应用程序启动时创建服务。

public void ConfigureServices(IServiceCollection services)
{
    // AddDbContext

    Project project = new Project(dbContext); // How to get dbcontext?
    services.AddSingleton(typeof(Project), project);
}

在这种情况下如何传递dbcontext?

更新 现在,在Stratup类中,我调用项目服务的init()方法。 Startup.cs

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
{
    Project project = serviceProvider.GetService<Project>();
    project.Init();

    // some code
}

1 个答案:

答案 0 :(得分:1)

Dunno,为什么不在您的第一个代码中使用自动Dependecy注入

在应用启动时创建单人。只要在构造函数内部调用init方法,它就会运行。所以这段代码已经可以在您的情况下使用了

public void ConfigureServices(IServiceCollection services)
{
    string connection = Configuration.GetConnectionString("ConnectionDB");
    services.AddDbContext<DataBaseContext>(options => options.UseSqlServer(connection), ServiceLifetime.Transient, ServiceLifetime.Singleton);

    services.AddSingleton<Project>();
}

但是无论如何,如果您坚持实例化Project类,则可以使用它。使用ServiceProvider获取DBContext。

public void ConfigureServices(IServiceCollection services)
{
    // AddDbContext
    var sp = services.BuildServiceProvider();
    var dbContext = sp.GetRequiredService<DbContext>();
    Project project = new Project(dbContext); 
    services.AddSingleton(typeof(Project), project);
}