项目

分层解决方案:多租户架构

本文档提及的部分功能可能在免费版本中不可用。我们使用 * 符号来标明该功能在 团队版更高版本 中可用。

多租户是一种软件架构,其中软件的单个实例(代码库)在服务器上运行并为多个租户提供服务。租户之间相互隔离,可以拥有自己的数据、配置和用户。本文档解释了分层解决方案模板中多租户机制的工作原理。您可以在 多租户租户管理SaaS * 文档中了解更多关于多租户的信息。

分层解决方案中的多租户功能

分层解决方案模板仅在创建解决方案时选择了 启用多租户 * 选项后才会采用 多租户 架构。

saas模块选择

您可以为每个租户使用不同的数据库,也可以为部分租户共享一个数据库。在 *SaaS * 模块中,您可以在 连接字符串管理界面 中指定数据库连接字符串。所有缓存数据均按租户隔离。每个事件、后台作业及其他数据都随租户ID存储。

您可以在应用程序中使用 ICurrentTenant 服务来获取当前租户信息。

public class MyService : ITransientDependency
{
    private readonly ICurrentTenant _currentTenant;

    public MyService(ICurrentTenant currentTenant)
    {
        _currentTenant = currentTenant;
    }

    public void MyMethod()
    {
        var tenantId = _currentTenant.Id;
        var tenantName = _currentTenant.Name;
    }
}

此外,您还可以使用 数据过滤器 系统来禁用租户过滤器,并列出同一数据库中的所有数据。

public class MyBookService : ITransientDependency
{
    private readonly IDataFilter<IMultiTenant> _multiTenantFilter;
    private readonly IRepository<Book, Guid> _bookRepository;

    public MyBookService(
        IDataFilter<IMultiTenant> multiTenantFilter,
        IRepository<Book, Guid> bookRepository)
    {
        _multiTenantFilter = multiTenantFilter;
        _bookRepository = bookRepository;
    }

    public async Task<List<Book>> GetAllBooksIncludingDeletedAsync()
    {
        //临时禁用 IMultiTenant 过滤器
        using (_multiTenantFilter.Disable())
        {
            return await _bookRepository.GetListAsync();
        }
    }
}

在本文档中