2016-10-11 1 views
0

J'ai ajouté l'implémentation personnalisée de UserStore. Pour le constructeur de magasin d'utilisateur injecter UserRepository comment puis-je enregistrer ce avec simple, contenant de l'injecteurInjecter l'implémentation personnalisée pour Identity UserStore

mon code comme

public class UserStore : IUserStore<User>, IUserLoginStore<User>, IUserPasswordStore<User>, 
    IUserSecurityStampStore<User>, IUserEmailStore<User> 
{ 
    private readonly IRepository<User> _userRepository; 

    public UserStore(IRepository<User> userRepository) 
    { 
     _userRepository = userRepository; 
    } 

    //other implementations 
} 

ma UserManager Classe

public class UserStoreManager<T> : UserManager<User> where T : class 
{ 
    public UserStoreManager(IUserStore<User> store) : base(store) 
    { 

    } 
} 

Mise à jour

i ont essayé ceci en s'enregistrant comme ceci

container.Register<IUserStore<User>, UserStore>(Lifestyle.Scoped); 
container.Register<UserManager<User>, UserStoreManager<User>>(Lifestyle.Scoped); 

puis je me suis une exception

enter image description here

+0

Je n'ai aucune idée de comment inscrire IUserStore au conteneur j'ai essayé avec ce 'container.Register > (() => nouveau UserStore(), Lifestyle.Scoped);' mais le constructeur par défaut doit être initialisé avec IRepository type – Gayan

+0

pouvez-vous pas enregistrer le type avec le simple injecteur, au lieu d'ajouter un initialiseur (et si vous devez ajouter le lambda pour l'initialisation, pouvez-vous pas faire container.Resolve >() pour l'utiliser comme paramètre? – Icepickle

+0

@Icepickle je ne suis pas sûr que je vous ai bien compris pourriez-vous s'il vous plaît ajouter un échantillon de code? – Gayan

Répondre

1

Quand je dois initialiser UserStore je viens d'utiliser les éléments suivants

container.RegisterPerWebRequest<IUserStore<User>>(() => new UserStore<User>((IRepository<User>)container.GetInstance<IRepository<User>>())); 

UserStore a besoin de l'instance du contexte, mais il est seulement possible d'obtenir le contexte actuel avec GetInstance car il est "calculé à l'exécution", en fonction du style de vie du contexte

Modifier 1

Pour UserManager vous devez effectuer les opérations suivantes:

container.RegisterPerWebRequest(() => new ApplicationUserManager(container.GetInstance<IUserStore<ApplicationUser>>(), DataProtectionProvider)); 

Il suit le même principe que ci-dessus.

DataProtectionProvider est un argument de ma méthode appelée InitializeContainer

private static void InitializeContainer(Container container, IDataProtectionProvider DataProtectionProvider) 
{ 
    /* OMITTED */ 
    container.RegisterPerWebRequest(() => new ApplicationUserManager(container.GetInstance<IUserStore<ApplicationUser>>(), DataProtectionProvider)); 
} 

qui est utilisé sur:

public static void InitializeInjector(this IAppBuilder app, IDataProtectionProvider DataProtectionProvider) 
{ 
    var container = new Container(); 
    container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 
    container.Options.PropertySelectionBehavior = new PropertySelectionBehavior<InjectAttribute>(); 

    InitializeContainer(container, DataProtectionProvider); // Here 
    app.UseOwinContextInjector(container); 
    app.MapSignalR(container); 

    container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 
    container.Verify(); 
    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 

    BinderConfig.RegisterModelBinders(container); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters, container); 
} 

qui est appelé

public void Configuration(IAppBuilder app) 
{ 
    ConfigureAuth(app); 
    app.InitializeInjector(app.GetDataProtectionProvider()); 
} 

Ainsi, DataProtectionProvider vient du IAppBuilder

+0

super merci !!! – Gayan