-
Notifications
You must be signed in to change notification settings - Fork 861
28810 edited this page Mar 14, 2019
·
28 revisions
维基百科:“软件多租户是指一种软件架构,在这种软件架构中,软件的一个实例运行在服务器上并且为多个租户服务”。一个租户是一组共享该软件实例特定权限的用户。有了多租户架构,软件应用被设计成为每个租户提供一个 专用的实例包括该实例的数据的共享,还可以共享配置,用户管理,租户自己的功能和非功能属性。多租户和多实例架构相比,多租户分离了代表不同的租户操作的多个实例。
多租户用于创建Saas(Software as-a service)应用(云处理)。
FreeSql.Repository 现实了 filter(过滤与验证)功能,如:
var topicRepos = fsql.GetGuidRepository<Topic>(t => t.TerantId == 1);
使用 topicRepos 对象进行 CURD 方法:
- 在查询/修改/删除时附加此条件,从而达到不会修改 TerantId != 1 的数据;
- 在添加时,使用表达式验证数据的合法性,若不合法则抛出异常;
利用这个功能,我们可以很方便的实现数据分区,达到租户的目的。
FreeSql.Repository 现实了 分表功能,如:
var tenantId = 1;
var reposTopic = orm.GetGuidRepository<Topic>(null, oldname => $"{oldname}{tenantId}");
上面我们得到一个仓储按租户分表,使用它 CURD 最终会操作 Topic_1 表。
更多说明参考:《FreeSql.Repository 仓储》
与方案二相同,只是表存储的位置不同,请查看 《FreeSql.Repository 仓储》、《分表、分库》。
分表下的租户也支持多表查询,得益于 FreeSql 提供的优良基础。这部份仍然在 FreeSql.Repository 扩展库中实现的。
var tenantId = 1;
var reposTopic = orm.GetGuidRepository<Topic>(null, oldname => $"{oldname}{tenantId}");
var reposType = orm.GetGuidRepository<TopicType>(null, oldname => $"{oldname}{tenantId}");
//联表查询也支持
reposTopic.Select
.FromRepository(reposType) //合并两个仓储的设置
.LeftJoin<TopicType>((a, b) => a.TypeId == b.Id)
.ToList();
上述代码的使用,将两个设置好的租户仓储合并起来查询,查询租户1下的 topic + topictype 数据,执行的 SQL语句:
SELECT ...
FROM "Topic_1" a
LEFT JOIN "TopicType_1" b ON a."TypeId" = b."Id"
FreeSql.Repository Autofac 注入方式实现了全局【过滤与验证】的设定,方便租户功能的设计;
具体可参考:《过滤器、全局过滤器》;