У меня есть следующие настройки в решении:
РЕДАКТИРОВАТЬ: Демо-решение можно найти здесь
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 без интерфейса, но проблема все еще существует. Я действительно понятия не имею, что я делаю неправильно!