c# - 如何根据传递给 ASP.NET MVC 中的 Controller /操作的属性值有条件地绑定(bind)到 ninject?

标签 c# asp.net-mvc-4 ninject

我有一个有两个实现的接口(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/

相关文章:

c# - 单声道项目: How do I assign a C# generic list as a TableView's datasource?

c# - 使用 Ninject 基于对象(callcontext)返回不同的提供者(绑定(bind))

asp.net-mvc - 使用 DI ninject 的自定义角色提供程序抛出错误

unity-container - 如何使用统一根据注入(inject)的类型有条件地绑定(bind)实例?

用于生成共享相同闭包变量的匿名委托(delegate)的 C# 技术

c# - ProcessStartInfo 的标准输入编码?

c# - 使用接口(interface)引用变量调用基类方法

c# - 正在删除文件,但访问被拒绝

asp.net-mvc - 将类对象从一个 Controller 操作传递到 ASP.net MVC 4 中的不同 Controller 操作

c# - 如何动态覆盖 Html.ActionLink 生成的 URL?