Я следующие this post чтобы узнать о DI с AutoFac. Мой контекст DB зарегистрирован в Startup.cs так:Как зарегистрировать интерфейс для конструктора EntityFramework.UserStore <TUser>?
builder.RegisterType<MyDb>().As<IMyDbCtx>().InstancePerRequest();
я следовал инструкциям, чтобы создать класс ApplicationUserStore и зарегистрировал этот тип, как так:
builder.RegisterType<ApplicationUserStore>().As<IUserStore<ApplicationUser>>().InstancePerRequest();
Это все было прекрасно, пока я понял, что ApplicationUserStore ожидает конкретного DbContext в его конструкторе передать его базовый конструктор:
public ApplicationUserStore(MyDb context)
: base(context)
{
}
Когда я запустить приложение и попробуйте загрузку Регис трация страница, это ошибка я вижу:
Ни один из конструкторов, найденных с «Autofac.Core.Activators.Reflection.DefaultConstructorFinder» по типу «TestApp.Service.IdentityConfig.ApplicationUserStore» не может быть вызван с имеющимися услуг и параметров: Не удается разрешить параметр 'TestApp.Data.MyDb context' конструктора 'Void .ctor (MyApp.Data.MyDb)'.
Это нарушение, я предполагаю, потому что я уже настроил MyDB как IMyDbCtx, поэтому он не будет принимать конкретный тип. Это хорошо, потому что я не хочу быть непоследовательным, вводя абстракции в некоторых местах и реализации в других.
Есть ли у кого-нибудь идеи о том, как я могу передать IMyDbCtx в UserStore ctor, в частности с помощью AutoFac?
'DbContext' от Entity Framework не значит быть позади интерфейса таким образом. И «Injection Dependency» не означает создание интерфейса для каждого класса, который у вас есть. – trailmax
Да, я знаю. Но бессмысленно иметь интерфейс и внедрять реализацию, если только это не очень конкретный случай (например, интерфейс предназначен для инъекции другими модулями, но некоторые внутренние типы могут внедрять реализацию). Я рекомендую стартеру темы убедиться, что это «конкретный» случай. И если это не так - попробуйте избавиться от интерфейса или внедрить реализацию. –