Идентификатор поставщика и индивидуальная инъекция
Я загрузил этот образец, в котором я могу попробовать функции Identity Provider в ASP.NET MVC 5:
http://www.nuget.org/packages/Microsoft.AspNet.Identity.Samples
Я использовал много раз Unity DI для своих репозиториев, сервисов, единицы работы и других вещей без проблем.
Но теперь, когда я устанавливаю Unity DI, у меня много проблем с интерфейсами и DI, которые используют Identity Provider.
Я просто загрузил код примера, и я настроил Unity DI, но я не хочу использовать Unity для членства в Identity, я хочу использовать Unity DI только для меня (IRepository, IService, IUnitOfWork и т.д. )
У меня есть эта ошибка, когда я пытаюсь зарегистрировать пользователя:
Текущий тип, Microsoft.AspNet.Identity.IUserStore'1 [Ecoavantis.Interactive.GCI.Models.ApplicationUser], является интерфейсом и не может быть сконструирован. Вам не хватает картографирования типов?
Я прочитал сообщение, в котором они сказали, что я должен включить что-то вроде этого, но мне не нужно вводить зависимости в Identity Provider...
container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
Кто-нибудь может мне помочь?
Пример кода:
/// <summary>Registers the type mappings with the Unity container.</summary>
/// <param name="container">The unity container to configure.</param>
/// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to
/// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks>
public static void RegisterTypes(IUnityContainer container)
{
// NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
// container.LoadConfiguration();
// TODO: Register your types here
//container.RegisterType<DbContext, ApplicationDbContext>(new ContainerControlledLifetimeManager());
container.RegisterType<IUnitOfWorkAsync, UnitOfWork>(new PerRequestLifetimeManager());
container.RegisterType<IMainPanelService, MainPanelService>();
container.RegisterType(typeof (IRepositoryAsync<>), typeof (Repository<>));
container.RegisterType<IDataContextAsync, ecoavantisinteractivegciContext>(new PerRequestLifetimeManager());
}
Ответы
Ответ 1
Хорошо, я решил свою проблему, я применил зависимости этим методом, но я не очень хорошо понимаю, почему он работает...
Теперь Identity отлично работает с моим Unity DI
container.RegisterType<AccountController>(new InjectionConstructor());
container.RegisterType<RolesAdminController>(new InjectionConstructor());
container.RegisterType<ManageController>(new InjectionConstructor());
container.RegisterType<UsersAdminController>(new InjectionConstructor());
Ответ 2
В моем случае я добавил следующее в UnityConfig.cs в методе RegisterComponents.
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
Ответ 3
Спасибо chemitaxis! Поскольку комментариев не хватает, я отправляю новый ответ. Я предполагаю, что chemitaxis создал последние 3 контроллера самостоятельно, потому что, похоже, просто регистрация первого AccountController
работала для меня, хотя я расширил свойства модели User
:
container.RegisterType<AccountController>(new InjectionConstructor());
Ответ 4
Обновление для chemitaxis и hvaughan3 ответ. Поскольку вы говорите, что это происходит, когда вы пытаетесь зарегистрировать пользователя, это, вероятно, в стандартном AccountController
. Исходной проблемой для этого является то, что Unity пытается вызвать конструктор с двумя параметрами, например:
public AccountController(
ApplicationUserManager userManager,
ApplicationSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
Следующая строка сообщит Unity о вызове конструктора без параметров и больше ничего не понадобится.
container.RegisterType<AccountController>(new InjectionConstructor());
Надеюсь, это объяснение поможет.