Erreur d’inscription Simple Injector Identity UserManager

Je suis l’architecture d’oignon et j’utilise Identity Framework. Dans mon projet de base, j’ai:

public interface IUserRepository : IDisposable { // Repository methods....... } 

Dans mon référentiel d’architecture, j’ai

 public class UserRepository : IUserRepository { // This is Identity UserManager private readonly UserManager _userManager; private readonly IAuthenticationManager _authenticationManager; private bool _disposed; public UserRepository(UserManager userManager, IAuthenticationManager authenticationManager) { _userManager = userManager; _authenticationManager = authenticationManager; } } 

Dans mon projet de résolution de dépendance, j’ai:

 [assembly: WebActivatorEx.PreApplicationStartMethod(typeof(IocConfig), "RegisterDependencies")] namespace AdShad.Infrastructure.DependencyResolution { public class IocConfig { public static void RegisterDependencies() { var container = new Container(); container.RegisterWebApiRequest(); container.RegisterWebApiRequest(); container.RegisterManyForOpenGeneric(typeof(IRepository), typeof(BaseRepository).Assembly); container.RegisterWebApiRequest(); container.RegisterWebApiRequest( () => HttpContext.Current.GetOwinContext().Authentication); container.Verify(); HttpConfiguration config = new HttpConfiguration { DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container) }; } } } 

Sur container.Verify() , j’obtiens l’erreur suivante:

Une exception de type ‘System.InvalidOperationException’ s’est produite dans SimpleInjector.dll mais n’a pas été gérée dans le code utilisateur

Informations complémentaires: La configuration est invalide. La création de l’instance pour le type IUserRepository a échoué. Le délégué inscrit pour le type IUserRepository a levé une exception. Aucun enregistrement de type UserManager n’a pu être trouvé et un enregistrement implicite n’a pas pu être effectué. Le constructeur de type UserManager contient le paramètre de type IUserStore avec le nom ‘store’ non enregistré. Assurez-vous que IUserStore est enregistré ou modifiez le constructeur de UserManager.

Est-ce que quelqu’un peut me guider ce que je fais mal et ce que je dois faire pour le corriger?

Le message d’exception dit:

Le constructeur de type UserManager contient le paramètre de type IUserStore avec le nom ‘store’ non enregistré. Assurez-vous que IUserStore est enregistré ou modifiez le constructeur de UserManager.

L’exception suggère que vous deviez enregistrer IUserStore , car UserManager dépend. Ainsi, vous pouvez par exemple effectuer l’enregistrement suivant:

 // UserStore is defined in Microsoft.AspNet.Identity.EntityFramework. // Do note that UserStore implements IUserStore, so // this Entity Framework provider requires a ssortingng. If you need int, you // might have your own store and need to build your own IUserStore implemenation. container.Register>( () => new UserStore>(), Lifestyle.Scoped); 

Toutefois, selon cet article , vous ne devez pas UserManager automatiquement des types d’ UserManager tels que UserManager , mais utiliser un enregistrement manuel à la place en créant ce type vous-même. Par exemple:

 container.Register>( () => new UserManager(new UserStore()), Lifestyle.Scoped); 

Il serait même préférable de ne pas utiliser les types de bibliothèques externes (telles que UserManager ) directement dans votre application principale. Surtout que vous pratiquez l’architecture d’oignon. Cette architecture promeut les principes SOLID et décrit le concept de ports et d’adaptateurs. Un port est une abstraction définie par votre application qui permet à une passerelle d’accéder à un domaine ou une bibliothèque externe. Un adaptateur est une implémentation d’une telle abstraction qui se connecte réellement à ce domaine externe ou à cette bibliothèque. C’est exactement ce que décrit le principe d’inversion de dépendance (l’un des cinq principes SOLID).

Au lieu de laisser votre UserRepository dépendre d’un type de structure tel que UserManager , laissez-le dépendre d’une abstraction définie de manière personnalisée, avec une responsabilité très étroitement définie et unique . L’adaptateur pour cette abstraction peut à son tour utiliser UserManager .

Selon ce UserRepository fait UserRepository , vous pouvez même considérer ce UserRepository lui-même comme un adaptateur. Dans ce cas, laisser UserRepository dépendre directement de UserManager convient. Dans ce cas, masquer UserManager derrière une abstraction supplémentaire ne fait que créer une couche supplémentaire / inutile d’abstraction.

Néanmoins, l’adaptateur peut non seulement dépendre directement de UserManager , mais il peut simplement contrôler la création et la destruction de UserManager . En d’autres termes, votre UserRepository peut se présenter comme suit:

 // NOTE: Do not let IUserRepository implement IDisposable. This violates // the Dependency Inversion Principle. // NOTE2: It's very unlikely that UserRepository itself needs any disposal. public class UserRepository : IUserRepository { // This is Identity UserManager private readonly IAuthenticationManager _authenticationManager; public UserRepository(IAuthenticationManager authenticationManager) { _authenticationManager = authenticationManager; } public void Delete(AppUser user) { // Here we create and dispose the UserManager during the execution // of this method. using (manager = new UserManager( new UserStore())) { manager.DeleteAsync(user).Result; } } } 

Les discussions sur Simple Injector contiennent une description intéressante sur la façon de travailler avec le modèle par défaut d’Identity et Visual Studio. Et voici un Stackoverflow q / a sur l’identité que vous pourriez trouver intéressant aussi.