2016-10-11 20 views
0

我添加了UserStore的自定義實現。對於用戶存儲構造我注入UserRepository我怎麼能註冊一個簡單的注射器容器注入標識UserStore的自定義實現

我的代碼就像

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 
} 

我的UserManager類

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

    } 
} 

更新

我有通過這樣的註冊試用了這個

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

然後我得到一個異常

enter image description here

+0

我不知道如何註冊IUserStore到容器我試着用這個'container.Register >(()=> new UserStore(),Lifestyle.Scoped);'但需要使用IRepository初始化的默認構造函數 type – Gayan

+0

你不能註冊類型與簡單的注入器,而不是添加一個初始化器(如果你必須添加lambda進行初始化,你不能做container.Resolve >()來使用它作爲參數嗎? – Icepickle

+0

@Ippickle我不確定我是否正確理解了你,請你添加一些代碼示例? – Gayan

回答

1

當我需要初始化UserStore我只是用下面

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

UserStore需要上下文的一個實例,但它是唯一可能得到當前上下文與GetInstance,因爲它是「運行時計算」,取決於上下文生活方式

編輯1

UserManager,你需要做到以下幾點:

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

它遵循同樣的原則以上。

DataProtectionProvider是叫InitializeContainer

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

我的方法的參數,它是在使用:

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); 
} 

這就是所謂的

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

所以,DataProtectionProvider來自IAppBuilder

+0

非常感謝! – Gayan