Не удается внедрить DbContext в хранилище - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь настроить DI для нового сайта ASP.NET Core, и у меня есть этот код:

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    // Get the configuration from the app settings.
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .Build();

    // Get app settings to configure things accordingly.
    var appSettings = Configuration.GetSection("AppSettings");
    var settings = new AppSettings();
    appSettings.Bind(settings);

    services
        .AddOptions()
        .Configure<AppSettings>(appSettings)
        .AddSingleton<IConfigurationRoot>(config)
        .AddDbContext<MyDbContext>(builder =>
        {
            builder.UseSqlServer(config.GetConnectionString("myConn"));
        }, ServiceLifetime.Transient, ServiceLifetime.Transient);

    services.AddSingleton<ILoadTestCleanUpServiceRepository, LoadTestCleanUpServiceRepository>();
        ...

Теперь LoadTestCleanUpServiceRepository зависит от MyDbContext:

public class LoadTestCleanUpServiceRepository : ILoadTestCleanUpServiceRepository
{
    private readonly MyDbContext _dbContext;

    public LoadTestCleanUpServiceRepository(MyDbContext dbContext)
    {
        _dbContext = dbContext;
    }
    ...

.. и контекст БД выглядит так:

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> ctxOptions) : base(ctxOptions)
    {
    }
}

При запуске приложения я получаю эту ошибку:

InvalidOperationException: Невозможно разрешить службу для типа«MyCode.Infrastructure.Common.MyDbContext» при попытке активировать «MyCode.Infrastructure.LoadTestCleanUpService.LoadTestCleanUpServiceRepository».

Я попытался изменить ServiceLifetime параметры и добавив этот дополнительный код:

services.AddTransient<MyDbContext>(sp => new MyDbContext(config));

... но, похоже, ничего не помогает, и я не могу понять, почему это не работает.Он пытается создать хранилище, но почему он не может также создать контекст БД?Это даже не доходит до того, что я звоню UseSqlServer()!Есть идеи?

ОБНОВЛЕНИЕ 1:

Хмм ... Теперь я вижу это.Скорее всего это связано:

enter image description here

ОБНОВЛЕНИЕ 2:

У меня сейчас:

  • Заменен EF 6 на Microsoft.EntityFrameworkCore.SqlServer
  • Обновлен до целевой платформы netcoreapp2.2 для решения некоторых конфликтующих версий сборки.
  • Сделал область репозитория.

Но я все еще получаю ту же ошибку.

1 Ответ

3 голосов
/ 27 марта 2019

Я вижу, вы зарегистрировали LoadTestCleanUpServiceRepository как Singleton, а MyDbContext как Transient, а затем вы пытаетесь разрешить MyDbContext из LoadTestCleanUpServiceRepository. Это проблема. В соответствии с сроком службы ядра ASP.NET документацией:

Опасно разрешать выделенную службу / временную службу из единственного пакета. Это может привести к неправильному состоянию службы при обработке последующих запросов.

Решение: зарегистрируйте LoadTestCleanUpServiceRepository и MyDbContext следующим образом:

services.AddDbContext<MyDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("YourConnectionStringName")));

services.AddScoped<ILoadTestCleanUpServiceRepository, LoadTestCleanUpServiceRepository>();

Теперь проблема должна исчезнуть.

...