博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在ASP.NET Core上实施每个租户策略的数据库
阅读量:4542 次
发布时间:2019-06-08

本文共 3993 字,大约阅读时间需要 13 分钟。

在ASP.NET Core上实施每个租户策略的数据库

不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址

本博文翻译自:

让我们继续使用ASP.NET Core web应用程序中的多租户,并关注每个租户都有自己的数据库的解决方案。它不仅仅是关于数据库的——可以有更多的服务,每个租户都有自己的实例。它使这里提供的解决方案可以轻松地扩展到除SQL Server或其他任何关系数据库之外的其他服务。

以往的工作

在讨论解决方案之前,我建议先浏览一下我以前的文章,内容包括ASP.NET Core web应用程序中的多租户的一些方面:

注意! 本文中的代码建立在上述文章的代码之上。

将数据库连接字符串移动到租户配置

这里的问题是如何动态决定使用哪个连接字符串,以及如何使用web应用程序配置未更改的方式使连接字符串可用。后者实际上是在我之前的多租户文章中解决的我建议使用我此篇文章中提到的BlobStorageTenantProvider

与前一篇文章不同的是,当租户使用不同的数据库时,在这些数据库中不需要租户id。不支持软删除的应用程序可以在使用本文建议的解决方案时使用经典的简单数据上下文。

新的租户类有一个额外的属性- DatabaseConnectionString,如这里所示。

public class Tenant{    public int Id { get; set; }    public string Name { get; set; }    public string Host { get; set; }    public string DatabaseConnectionString { get; set; }}

在Azure blob存储中保存的租户配置文件将是这样的。


[  {    "Id": 2,    "Name": "Local host",    "Host": "localhost:30172",    "DatabaseConnectionString": "
" }, { "Id": 3, "Name": "Customer X", "Host": "localhost:3331", "DatabaseConnectionString": "
" }, { "Id": 4, "Name": "Customer Y", "Host": "localhost:33111", "DatabaseConnectionString": "
" }]

返回租户而不是租户ID

由于租户可以定义更多的设置,所以开始处理租户类而不是租户ID。它将改变我的ITenantProvider接口和BlobStorageTenantProvider类。


public class BlobStorageTenantProvider : ITenantProvider{    private static IList
_tenants; private Tenant _tenant; public BlobStorageTenantProvider(IHttpContextAccessor accessor, IConfiguration conf) { if(_tenants == null) { LoadTenants(conf["StorageConnectionString"], conf["TenantsContainerName"], conf["TenantsBlobName"]); } var host = accessor.HttpContext.Request.Host.Value; var tenant = _tenants.FirstOrDefault(t => t.Host.ToLower() == host.ToLower()); if(tenant != null) { _tenant = tenant; } } private void LoadTenants(string connStr, string containerName, string blobName) { var storageAccount = CloudStorageAccount.Parse(connStr); var blobClient = storageAccount.CreateCloudBlobClient(); var container = blobClient.GetContainerReference(containerName); var blob = container.GetBlobReference(blobName); blob.FetchAttributesAsync().GetAwaiter().GetResult(); var fileBytes = new byte[blob.Properties.Length]; using (var stream = blob.OpenReadAsync().GetAwaiter().GetResult()) using (var textReader = new StreamReader(stream)) using (var reader = new JsonTextReader(textReader)) { _tenants = JsonSerializer.Create().Deserialize
>(reader); } } public Tenant GetTenant() { return _tenant; }}

动态配置数据上下文

我想在这里,多租户应用程序不处理软删除。现在,为了使用正确的连接字符串,必须修改mult-tenant应用程序的默认数据上下文。


public class PlaylistContext : DbContext{    private readonly Tenant _tenant;     public DbSet
Playlists { get; set; } public DbSet
Songs { get; set; } public PlaylistContext(DbContextOptions
options, ITenantProvider tenantProvider) : base(options) { _tenant = tenantProvider.GetTenant(); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(_tenant.DatabaseConnectionString); base.OnConfiguring(optionsBuilder); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
().HasKey(e => e.Id); modelBuilder.Entity
().HasKey(e => e.Id); base.OnModelCreating(modelBuilder); }}

在查看代码时,很容易看出没有多少代码,但它会产生大胆灵活的模型,去支持不同的租户策略。

结束

ASP.NET Core的依赖注入模型和Entity Framework Core的灵活性使得在ASP.NET Core web应用程序中支持更复杂的场景变得非常容易。这篇博文关注的是多租户的一个方面——如何支持每个租户数据存储策略的数据库。如果需要的话,这个模型也可以扩展到更多的设置。

欢迎转载,转载请注明翻译原文出处(本文章),原文出处(原博客地址),然后谢谢观看

如果觉得我的翻译对您有帮助,请点击推荐支持:)

转载于:https://www.cnblogs.com/chen-jie/p/ASP-NET-MVC-Core-database-per-tenant.html

你可能感兴趣的文章
python3之正则表达式
查看>>
Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
查看>>
Java 时间总结
查看>>
jQuery EasyUI 拖放 – 基本的拖动和放置
查看>>
这些年正Android - 母亲
查看>>
[工具] BurpSuite--XssValidator插件
查看>>
LPC1788系统时钟初始化
查看>>
channel vs mutex
查看>>
页面布局(--FlowLayout,--BorderLayout,--GridLayout)
查看>>
实验吧--web--你真的会php吗
查看>>
python中的setdefault()方法
查看>>
转 VSFTP用户权限管控
查看>>
poj2420 A Star not a Tree? 模拟退火
查看>>
微信小程序--登录授权,一键获取用户微信手机号并登录
查看>>
[转载] C#面向对象设计模式纵横谈——13. Proxy代理模式
查看>>
JqueryEasyUI浅谈---视频教程公布
查看>>
ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致”...
查看>>
Javaweb之 servlet 开发详解1
查看>>
Restore IP Addresses
查看>>
DWR框架简单应用
查看>>