Ninject Bind IIdentityMessageService两次

时间:2016-01-13 10:29:25

标签: c# ninject asp.net-identity-2 ninject.web.mvc

我希望你对一切都做得很好。

我正在尝试从项目模板附带的默认实现中分离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?

1 个答案:

答案 0 :(得分:1)

解决方案是使用named bindings

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