Ninject绑定IIdentityMessageService两次
本文关键字:两次 IIdentityMessageService 绑定 Ninject | 更新日期: 2023-09-27 18:30:11
我希望你一切都做得很好。
我试图将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仅一次。
如前所述,我将用户管理器移到了一个单独的库中,我的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))