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

凤凰

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

对于每个用户,都有一个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; }
        }
    }

数据库上下文文件

    public class CustomerDBContext : DbContext {

        public CustomerDBContext(string db_name) : base("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; }
    }
霍曼巴林

您可以从访问用户声明HttpContext

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

对于您的ninject代码,您可以创建以下扩展方法HttpContext

public static HttpcontextExtensions 
{
    public static string GetDbName(this HttpContext context)
    {
        return ((ClaimsPrincipal)context.Current.User)
               .Claims
               .FirstOrDefault(c => c.Type == "db_name");
    }
}

并使用以下ninject绑定:

kernel.Bind<ICustomerRepository>()
    .To<CustomerRepository>()
    .WithConstructorArgument("db_name", HttpContext.GetDbName());

有关在ninject中访问的更多信息,请参阅此文档HttpContext


在您的示例中,CustomerRepository依赖于HttpContext,这不是一个好的设计。CustomerRepository需要一个db-name,这就是应该在构造函数中传递的名称。与此相关的是尼古拉的IoC第四定律

被解析的类的每个构造函数除了接受一组自己的依赖关系之外,都不应具有任何实现。

举个例子,您HttpContext的测试项目中没有任何内容,这使单元测试CustomerRepository变得复杂。

PS我不知道您的设计,但也许从db-name中获取HttpContext不是一个理想的解决方案...用户可能会注销或清除其浏览器历史记录,并且您将失去db-name。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Ninject,MVC5,EF6,存储库+ UoW

来自分类Dev

使用EF6将文档存储在数据库ASP.NET MVC5中-代码优先

来自分类Dev

ASP.Net MVC 5 + SignalR + Ninject

来自分类Dev

首先在ASP.Net MVC EF6数据库中使用VB.Net

来自分类Dev

ASP.NET MVC 4 EF6无法连接到SQL Server Express数据库

来自分类Dev

Nest无法使用EF6 / MVC5应对大型数据库模型

来自分类Dev

具有迁移功能的ASP.NET MVC 6 + EF6

来自分类Dev

asp.net MVC 4 Ninject OnApplicationStarted()

来自分类Dev

正确的架构,可与Ninject,ASP.NET MVC 5松散耦合

来自分类Dev

如何在ASP.NET MVC 5中将IAuthenticationManager与Ninject绑定?

来自分类Dev

如何在ASP.NET MVC 5中将IAuthenticationManager与Ninject绑定?

来自分类Dev

MVC5 EF6无需使用模型即可从数据库表中读取数据

来自分类Dev

MVC5 EF6 CodeFirst使用两个数据库进行调试和发布

来自分类Dev

首先将表添加到现有数据库代码MVC 5 EF6

来自分类Dev

使用单数据库多模式的ASP.NET MVC多租户应用程序:从应用程序调用存储过程尝试访问dbo表

来自分类Dev

在ASP.NET 5 / EF 6中获取数据库连接字符串

来自分类Dev

在ASP.NET MVC中使用两个存储库进行Ninject

来自分类Dev

使用Ef6 Code First在ASP MVC5中扩展默认ApplicationDbContext的简单方法

来自分类Dev

如何将ado.net数据库连接到ASP.Net MVC 5

来自分类Dev

如何将ado.net数据库连接到ASP.Net MVC 5

来自分类Dev

如何在渴望加载的ASP.NET MVC中的EF6中包括导航属性的多个导航属性?

来自分类Dev

加载Ninject组件ICache时ASP.NET MVC错误

来自分类Dev

ASP.Net MVC中的Ninject Singleton绑定

来自分类Dev

ASP.NET MVC 5-从数据库中选择数据的LINQ查询

来自分类Dev

ASP.NET MVC 5-从数据库中选择数据的LINQ查询

来自分类Dev

如何使EF查询返回MVC 5 ASP.NET中多对多关系表的聚合值

来自分类Dev

在Asp.Net MVC 5中实现多个数据库的最佳实践是什么?

来自分类Dev

Asp.Net MVC 5身份创建数据库管理界面

来自分类Dev

在ASP.NET MVC 5中使用视图模型或数据库模型

Related 相关文章

  1. 1

    Ninject,MVC5,EF6,存储库+ UoW

  2. 2

    使用EF6将文档存储在数据库ASP.NET MVC5中-代码优先

  3. 3

    ASP.Net MVC 5 + SignalR + Ninject

  4. 4

    首先在ASP.Net MVC EF6数据库中使用VB.Net

  5. 5

    ASP.NET MVC 4 EF6无法连接到SQL Server Express数据库

  6. 6

    Nest无法使用EF6 / MVC5应对大型数据库模型

  7. 7

    具有迁移功能的ASP.NET MVC 6 + EF6

  8. 8

    asp.net MVC 4 Ninject OnApplicationStarted()

  9. 9

    正确的架构,可与Ninject,ASP.NET MVC 5松散耦合

  10. 10

    如何在ASP.NET MVC 5中将IAuthenticationManager与Ninject绑定?

  11. 11

    如何在ASP.NET MVC 5中将IAuthenticationManager与Ninject绑定?

  12. 12

    MVC5 EF6无需使用模型即可从数据库表中读取数据

  13. 13

    MVC5 EF6 CodeFirst使用两个数据库进行调试和发布

  14. 14

    首先将表添加到现有数据库代码MVC 5 EF6

  15. 15

    使用单数据库多模式的ASP.NET MVC多租户应用程序:从应用程序调用存储过程尝试访问dbo表

  16. 16

    在ASP.NET 5 / EF 6中获取数据库连接字符串

  17. 17

    在ASP.NET MVC中使用两个存储库进行Ninject

  18. 18

    使用Ef6 Code First在ASP MVC5中扩展默认ApplicationDbContext的简单方法

  19. 19

    如何将ado.net数据库连接到ASP.Net MVC 5

  20. 20

    如何将ado.net数据库连接到ASP.Net MVC 5

  21. 21

    如何在渴望加载的ASP.NET MVC中的EF6中包括导航属性的多个导航属性?

  22. 22

    加载Ninject组件ICache时ASP.NET MVC错误

  23. 23

    ASP.Net MVC中的Ninject Singleton绑定

  24. 24

    ASP.NET MVC 5-从数据库中选择数据的LINQ查询

  25. 25

    ASP.NET MVC 5-从数据库中选择数据的LINQ查询

  26. 26

    如何使EF查询返回MVC 5 ASP.NET中多对多关系表的聚合值

  27. 27

    在Asp.Net MVC 5中实现多个数据库的最佳实践是什么?

  28. 28

    Asp.Net MVC 5身份创建数据库管理界面

  29. 29

    在ASP.NET MVC 5中使用视图模型或数据库模型

热门标签

归档