Идентификатор поставщика и индивидуальная инъекция

Я загрузил этот образец, в котором я могу попробовать функции 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());

Надеюсь, это объяснение поможет.