Entity Framework DbContext НЕ удаляется с помощью внедрения зависимостей - PullRequest
0 голосов
/ 24 марта 2020

У меня есть следующие настройки в решении:

РЕДАКТИРОВАТЬ: Демо-решение можно найти здесь

ASP. NET Core Web API:

public class MyController : ControllerBase
{
    private readonly IMyService _service;
    public MyController(IMyService service)
        {
             _service = service;
        }
}

Сервисный уровень:

public class MyService: IMyService, IDisposable
{
    private readonly IDataContext _context;
    public MyService(IDataContext context)
        {
             _context = context;
        }
}

Entity Framework Core:

public class DataContext : DbContext, IDataContext, IDisposable
{
    public DataContext(DbContextOptions<DataContext> options, IAuthenticationService authentication, ILogger<DataContext> logger) : base(options) 
        {
            ...
        }
}

Композиция Root, чтобы связать все это вместе с помощью Microsoft.Extensions.DependencyInjection:

services.AddDbContext<DataContext>(options =>  options.UseSqlServer(configuration.GetConnectionString("myConnection")), ServiceLifetime.Transient);
services.AddTransient<IMyService, MyService>();
//EDIT: removed this line
//services.AddTransient<IDataContext, DataContext>(); 

Все это работает, как и ожидалось, но мой DataContext никогда не удаляется. Я добавил журналы в методы dispose для мониторинга этого поведения, но я не могу понять, почему это происходит (или не происходит в этом случае). Я попытался

  • переупорядочить AddTransient без успеха (как и ожидалось)
  • , используя AddScoped вместо AddTransient

I'm используя интерфейс для макета DbContext в моих модульных тестах, но я хочу, чтобы мой DbContext был утилизирован. Кто-нибудь знает, почему это происходит и как ее решить?

РЕДАКТИРОВАТЬ: некоторые дополнительные журналы

  • 2020-03-24 21: 09: 29.5727 | Параметры вводятся в DataContext
  • 2020-03-24 21: 09: 29.6064 | Аутентификация вводится в DataContext
  • 2020-03-24 21: 09: 29.6064 | Регистратор вводится в DataContext
  • 2020-03-24 21: 09: 29.6262 | Создан DataContext 1ddd98a1-a8f9-4096-8a11-c0b4d40d01ae
  • 2020-03-24 21: 09: 30.1918 | Регистратор введен в CustomerService
  • 2020-03-24 21: 09: 30.2200 | DataContext внедрен в CustomerService
  • 2020-03-24 21: 09: 30.2300 | Mapper введен в CustomerService
  • 2020 -03-24 21: 09: 30.2482 | Аутентификация введена в CustomerService
  • 2020-03-24 21: 09: 30.2482 | Создано CustomerService 5b446267-d908-4291-9918-af1841324708
  • 2020-03-24 21: 09: 30.2769 | Регистратор введен в CustomerController
  • 2020-03-24 21: 09: 30.2769 | CustomerService введен в CustomerController * 10 64 *
  • 2020-03-24 21: 09: 30.3186 | CustomerController.GetCustomer (4)
  • 2020-03-24 21: 09: 35.0599 | Утилизация CustomerService 5b446267-d908-4291- 9918-af1841324708

РЕДАКТИРОВАТЬ 25 марта: я пытался использовать DataContext без интерфейса, но проблема все еще существует. Я действительно понятия не имею, что я делаю неправильно!

1 Ответ

2 голосов
/ 24 марта 2020

Вы неправильно регистрируете DbContext

Используйте следующую перегрузку AddDbContext

services.AddDbContext<IDataContext, DataContext>(options =>  
    options.UseSqlServer(configuration.GetConnectionString("myConnection")));

, которая будет связывать интерфейс / абстракцию с конкретной реализацией.

И убрать временную регистрацию

services.AddTransient<IDataContext, DataContext>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...