web-dev-qa-db-de.com

Identity Provider und Unity Dependency Injection

Ich habe dieses Beispiel heruntergeladen, in dem ich die Features des Identitätsanbieters in ASP.NET MVC 5 testen kann:

http://www.nuget.org/packages/Microsoft.AspNet.Identity.Samples

Ich habe Unity DI oft für meine Repositories, Services, Arbeitseinheiten und anderes verwendet, ohne Probleme.

Aber jetzt, wenn ich Unity DI installiere, habe ich viele Probleme mit den Interfaces und DI, die den Identity Provider verwenden.

Ich habe gerade den Code des Beispiels heruntergeladen und das Unity DI konfiguriert, aber ich möchte Unity nicht für die Identitätsmitgliedschaft verwenden. Ich möchte Unity DI nur für mich verwenden (IRepository, IService, IUnitOfWork usw.) )

Ich habe diesen Fehler, wenn ich versuche, einen Benutzer zu registrieren:

Der aktuelle Typ Microsoft.AspNet.Identity.IUserStore`1 [Ecoavantis.Interactive.GCI.Models.ApplicationUser], ist eine Schnittstelle und kann nicht erstellt werden. Vermissen Sie einen Typ Kartierung?

Ich habe einen Beitrag gelesen, in dem sie sagten, dass ich so etwas einschließen muss, aber ich muss keine Abhängigkeiten in Identity Provider einfügen ... 

container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
            container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());

Kann mir jemand bitte helfen?

Code-Beispiel:

 /// <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());
         }
28
chemitaxis

Ok, ich habe mein Problem gelöst, ich habe die Abhängigkeiten mit dieser Methode injiziert, aber ich verstehe nicht gut, warum es funktioniert ... 

Nun funktioniert Identity gut mit meinem Unity DI

container.RegisterType<AccountController>(new InjectionConstructor());
container.RegisterType<RolesAdminController>(new InjectionConstructor());
container.RegisterType<ManageController>(new InjectionConstructor());
container.RegisterType<UsersAdminController>(new InjectionConstructor());
46
chemitaxis

In meinem Fall habe ich UnityConfig.cs in der RegisterComponents-Methode Folgendes hinzugefügt.

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
13
Oladipo Olasemo

Danke chemitaxis! Da ich nicht genug Vertreter bin, um einen Kommentar abzugeben, poste ich eine neue Antwort. Ich gehe davon aus, dass Chemitaxis die letzten 3 Controller selbst erstellt hat, weil die Registrierung der ersten AccountController für mich funktioniert zu haben scheint, obwohl ich die User-Modelleigenschaften erweitert habe:

container.RegisterType<AccountController>(new InjectionConstructor());
9
hvaughan3

Update für Chemitaxis und die Antwort von hvaughan3. Da Sie sagen, dass es passiert, wenn Sie versuchen, einen Benutzer zu registrieren, ist es wahrscheinlich im Standard AccountController. Das ursprüngliche Problem dabei ist, dass Unity versucht, den Konstruktor mit zwei Parametern aufzurufen, zum Beispiel:

public AccountController(
    ApplicationUserManager userManager,
    ApplicationSignInManager signInManager)
{
    UserManager = userManager;
    SignInManager = signInManager;
}

In der folgenden Zeile wird Unity aufgefordert, stattdessen den parameterlosen Konstruktor aufzurufen, und er benötigt keine weiteren Schritte.

container.RegisterType<AccountController>(new InjectionConstructor());

Ich hoffe, diese Erklärung hilft. 

0
Ogglas