web-dev-qa-db-fra.com

Fournisseur d'identité et injection de dépendance d'unité

J'ai téléchargé cet exemple dans lequel je peux essayer les fonctionnalités du fournisseur d'identité dans ASP.NET MVC 5:

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

J'ai utilisé plusieurs fois Unity DI pour mes référentiels, services, unité de travail et autres éléments sans problèmes.

Mais maintenant, lorsque j'installe Unity DI, j'ai de nombreux problèmes avec les interfaces et DI qui utilisent le fournisseur d'identité.

Je viens de télécharger le code de l'exemple et j'ai configuré Unity DI, mais je ne veux pas utiliser Unity pour l'identité, mais simplement Unity DI pour moi (IRepository, IService, IUnitOfWork, etc.). )

J'ai cette erreur lorsque j'essaie d'enregistrer un utilisateur:

Le type actuel, Microsoft.AspNet.Identity.IUserStore`1 [Ecoavantis.Interactive.GCI.Models.ApplicationUser], est une interface et ne peut pas être construit. Il vous manque un type cartographie?

J'ai lu un article dans lequel ils disaient que je devais inclure quelque chose comme ceci, mais que je n'avais pas besoin d'injecter de dépendances dans Identity Provider ... 

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

Quelqu'un peut-il m'aider s'il-vous-plaît?

Exemple de code:

 /// <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, j'ai résolu mon problème, j'ai injecté les dépendances avec cette méthode, mais je ne comprends pas très bien pourquoi ça marche. 

Maintenant, Identity fonctionne bien avec mon unité DI

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

Dans mon cas, j'ai ajouté ce qui suit à UnityConfig.cs dans la méthode RegisterComponents.

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

Merci chimitaxis! Comme je n'ai pas assez de rep pour commenter, je poste une nouvelle réponse. Je suppose que chemitaxis a créé lui-même les 3 derniers contrôleurs, car enregistrer la première variable AccountController semble avoir fonctionné pour moi, même si j'ai étendu les propriétés du modèle User

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

Mise à jour pour chimitaxis et hvaughan3 réponse. Puisque vous dites que cela se produit lorsque vous essayez d’enregistrer un utilisateur, c’est probablement dans la variable standard AccountController. Le problème initial pour cela est que Unity essaie d'appeler le constructeur avec deux paramètres, par exemple:

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

La ligne suivante indiquera à Unity d'appeler le constructeur sans paramètre et n'aura besoin de rien d'autre.

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

J'espère que cette explication aide. 

0
Ogglas