簡體   English   中英

Ninject綁定IIdentityMessageService兩次

[英]Ninject Bind IIdentityMessageService twice

希望您一切順利。

我試圖將asp.net身份UserManger實現與項目模板隨附的默認實現區分開。 對於DI,我正在使用Ninject(我是Ninject的新手)

現在我有這樣的東西...

 kernel.Bind<UserManager<User>>().To<UserManager>().InRequestScope();
 kernel.Bind<IUserTokenProvider<User, string>>().ToMethod(x =>
 {
     var provider = OwinConfig.DataProtectionProvider;
     return new DataProtectorTokenProvider<User>(provider.Create("ASP.NET Identity"));
 }).InRequestScope();


 kernel.Bind<SignInManager>()
       .ToSelf()
       .InRequestScope();

我正在嘗試注冊實現IIdentityMessageService的SmsService和EmailService

我正在做這樣的事情----並且它不適用於ninject

kernel.Bind<IIdentityMessageService>().To(typeof (SmsService)).InRequestScope();
kernel.Bind<IIdentityMessageService>().To(typeof (EmailService)).InRequestScope();

激活IIdentityMessageService時出錯,有多個匹配的綁定可用。

......

建議:1)確保僅為一次IIdentityMessageService定義綁定。

現在,正如之前所說,我將usermanager移到單獨的庫中,而UserManger的構造函數是

public UserManager(Context context, IIdentityMessageService emailService, 
    IIdentityMessageService smsService, IUserTokenProvider<User, string> tokenProvider = null)
    : base(new UserStore(context))

所以我的問題是,如何實現兩次注入IIdentityMessageService或如何使用ninject構造UserManager?

解決方案是使用命名綁定

kernel.Bind<IIdentityMessageService>().To(typeof (SmsService)).Named("Sms");
kernel.Bind<IIdentityMessageService>().To(typeof (EmailService)).Named("Email");

然后通過屬性解析它:

public UserManager(Context context, 
                  [Named("Email")] IIdentityMessageService emailService,
                  [Named("Sms")] IIdentityMessageService smsService, 
                  IUserTokenProvider<User, string> tokenProvider = null)
   : base(new UserStore(context))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM