Синглтон сервис и EF Core dbContext - PullRequest
0 голосов
/ 30 октября 2019

Приложение использует ASP.NET Core 3. При первом вызове создается служба класса проекта.

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 в этом случае?

UPDATE Теперь в классе Stratup я вызываю init () метод обслуживания проекта. Startup.cs

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

    // some code
}

1 Ответ

1 голос
/ 30 октября 2019

Не знаю, почему бы вам не использовать автоматический ввод зависимостей при первом коде

Singleton создаются при запуске приложения. И пока метод 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, вы можете использовать это. Получите DBContext, используя ServiceProvider.

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...