Я работаю над AspNetCore 2.1 WebApi.Я использую Microsoft.Extensions.DependencyInjection
, AspNetCore.Identity
и EntityFrameworkCore
.
В своих регистрациях DI я звоню:
services.AddDbContext<IMyDbContext, MyDbContext>();
Хорошо, верно?Обойти договор.Но затем я столкнулся с исключением, что классы Identity Manager (UserManager
, RoleManager
и т. Д.) Не могут быть преобразованы в контейнере внедрения зависимостей, поскольку хранилища идентификаторов, которые они используют (UserStore
, RoleStore
и т. Д.), Не могутразрешите их параметр DI (MyDbContext
).
Все это указывает на эту строку при настройке Identity:
builder.AddEntityFrameworkStores<MyDbContext>();
..., которая вырвется, так как хранилища идентификационных данных ищутконкретный контекст и он не зарегистрирован в DI.Расширение ожидает class
, что оно может разрешиться вплоть до DbContext
- и я не могу добавить неявный оператор к интерфейсу IMyDbContext
, чтобы дать ему неявное приведение, которое может использовать метод расширения DI.
Все это заставляет меня выполнять довольно уродливую регистрацию DI:
services
.AddDbContext<IMyDbContext, MyDbContext>()
.AddDbContext<MyDbContext>();
- регистрацию DI, которая может вызвать другие проблемы (безопасность потоков, транзакции) в нисходящем направлении, с которыми я еще не сталкивался.
Я предполагаю, что я мог бы очистить регистрацию DI, свернув свое собственное расширение IServiceCollection
и / или пользовательские хранилища идентификаторов - что действительно кажется здесь излишним, поскольку в противном случае мне не нужно выходить за рамки встроенного по умолчанию.в хранилищах идентификаторов.
Я также не хочу удалять регистрацию контекста <interface, concrete>
, поскольку она будет распространяться на все мои инъекции конструктора, и просто кажется неправильной .
Кто-нибудь уже занимался этим и нашел обходной путь?Или кто-нибудь может хотя бы подтвердить / опровергнуть, что двойная (интерфейс && конкретная) регистрация контекста в DI не вызовет других проблем?
Заранее спасибо!