我有一个有两个实现的接口(interface)。
Bind<IWebLoginService>().To<WebUserLoginService>();
Bind<IWebLoginService>().To<WebAdminLoginService>();
我有一个用户和管理员的通用登录名。对于我的系统,如果有人使用 @mycompanyname.com
登录,他是管理员,在这种情况下,我想使用 WebAdminLoginService
服务,如果不是,则使用 WebUserLoginService
编辑: 此电子邮件存在于发布到 Controller LoginAccountInfoModel
这是我的登录操作
[HttpPost]
[AllowAnonymous]
public ActionResult Login(LoginAccountInfoModel accountInfoModel, string returnUrl)
{...}
之前我有两个单独的 View 和操作用于管理员和客户登录,我在那里使用Named Binding
实现。
请多多指教。
最佳答案
这是我设法做到的另一种方式
第 1 步。创建一个可以返回正确服务的工厂
public interface ILoginServiceFactory
{
IUserLoginService GetLoginService(string username);
}
public class UserLoginServiceFactory : ILoginServiceFactory
{
private readonly IUserLoginService _userLoginService;
private readonly IUserLoginService _adminLoginService;
public UserLoginServiceFactory([Named("UserLogin")]IUserLoginService userLoginService, [Named("AdminLogin")]IUserLoginService adminLoginService)
{
_userLoginService = userLoginService;
_adminLoginService = adminLoginService;
}
public IUserLoginService GetLoginService(string username)
{
if (username.Contains("@somecompanyname.com"))
{
return _adminLoginService;
}
return _userLoginService;
}
}
**第 2 步:命名 ninject 绑定(bind)
Bind<IUserLoginService>().To<WebUserLoginService>().Named("UserLogin");
Bind<IUserLoginService>().To<WebAdminLoginService>().Named("AdminLogin");
第 3 步:成员资格提供商的绑定(bind)基于其注入(inject)的服务
Bind<MembershipProvider>().ToMethod(ctx => Membership.Provider);
Bind<MembershipProvider>().ToMethod(ctx => Membership.Providers["AdminSqlMembershipProvider"])
.WhenInjectedInto<WebAdminLoginService>();
第 4 步:询问工厂使用哪种服务
var webLoginService = _loginServiceFactory.GetLoginService(accountInfoModel.Email);
var signInInfo = webLoginService.SignIn(...)
关于c# - 如何根据传递给 ASP.NET MVC 中的 Controller /操作的属性值有条件地绑定(bind)到 ninject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27286737/