ASP.NET MVC 5 + EF6 + Ninject-多租户数据库

问题描述 投票:0回答:1

我有一个商业ASP.NET MVC5应用程序,每个客户都有自己的数据库。我想将EF6和Ninject用于DI。登录时,我使用的是ASP.NET身份。

对于每个用户,都有一个UserClaim,其中指定了数据库的名称:

  1. UserId = 1 | ClaimType =“ db_name” | ClaimValue =“ Customer0001”
  2. UserId = 2 | ClaimType =“ db_name” | ClaimValue =“ Customer0002”

依此类推...这意味着它是一个具有用于用户身份验证的“共享”数据库的Web应用程序,另一方面,每个客户都有自己的数据库-所有数据库都位于同一数据库服务器上(MS SQL Server )。

用户需要登录,登录后他应该从他的个人数据库(在UserClaim-Table中指定)接收数据。

对于Ninject,我想我必须有类似的东西

private void AddBindings() {
   kernel.Bind<EFDBContext>().ToMethod(c => new EFDBContext("db_name"));
}

但是我如何将UserClaim放入绑定中? (我不想使用会话,因为会话可能会丢失)。

绑定之后需要什么步骤?

例如,在AccountRepository中,EFDBContext期望使用“ db_name”>,但是我怎么到那里呢?

public class AccountRepository : IAccountRepository {
    private EFDBContext context = new EFDBContext("db_name");
}

最后,我可以在此类内部更改连接字符串?

public class EFDBContext : DbContext {
    public EFDBContext(string db_name) : base("EFDBContext") {

    }
}

@ Hooman Bahreini回答之后更新

NinjectDependencieResolver.cs

private void AddBindings() {
    kernel.Bind<ICustomerRepository>().To<CustomerRepository>().WithConstructorArgument("http_current_context", HttpContext.Current);
}

CustomerRepository.cs

    public class CustomerRepository : ICustomerRepository {

        private CustomerDBContext context;

        public CustomerRepository(HttpContext httpContext) {

            string db_name = "";
            var claimValue = ((ClaimsPrincipal)HttpContext.Current.User).Claims.FirstOrDefault(c => c.Type == "db_name");

            if(claimValue != null) {
                db_name = claimValue.Value.ToString();
            }

            context = new CustomerDBContext(db_name);
        }

        public IEnumerable<Test> Tests {
            get { return context.Test; }
        }
    }

DB上下文文件

    public class CustomerDBContext : DbContext {

        public CustomerDBContext(string db_name) : base("CustomerDBContext") {
            Database.SetInitializer(new NullDatabaseInitializer<CustomerDBContext>());

            string temp_connection = Database.Connection.ConnectionString.Replace(";Initial Catalog=;", ";Initial Catalog=" + db_name + ";");

            Database.Connection.ConnectionString = temp_connection;
        }

        public DbSet<Test> Test { get; set; }
    }
asp.net asp.net-mvc-5 entity-framework-6 ninject
1个回答
0
投票

您可以从HttpContext访问用户声明(请注意,以下代码需要System.Linq

var claimValue = ((ClaimsPrincipal)HttpContext.Current.User)
                 .Claims
                 .FirstOrDefault(c => c.Type == "db_name");

有关在ninject中访问this document的更多信息,请参见HttpContext。>

© www.soinside.com 2019 - 2024. All rights reserved.