PasteTemplate模板型项目的多租户实现

PasteTemplate是一一个ABP vNext的精简版的项目模板,基于这个模板创建的项目可以执行生成,快速的实现了基本的权限控制等!配合PasteBuilder可以实现基础接口的快速代码生成,你也可以基于PasteBuilder进阶功能实现基于自己的模板的代码生成!

PasteTemplate和PasteBuilder的使用教程

PasteBuilder的进阶用法

多租户可以大致理解成:

1.同一个数据库,表中有一个字段表示这条信息属于哪个租户的,在查询等的时候基于租户隔离

2.每个租户不同数据库,这个有个问题,就是多租户信息查询的时候!

由于需求,有可能你要添加一些模块回去,比如上一次的

https://blog.csdn.net/Apeart/article/details/140477429?spm=1001.2014.3001.5501

Abp(PasteTemplate)项目如何添加对审计日志Auditing的支持

本次将要实现的是多租户的实现,其实就是把多租户这个模块加回去!

参考资料

https://abp.io/docs/8.3/framework/architecture/multi-tenancy?_redirected=B8ABF606AA1BDF5C629883DF1061649A

https://www.cnblogs.com/myzony/p/12401352.html

添加模块

在对应的模块添加dll

具体版本要看你自己的Volo.Abp的版本!(我是在XXX.HttpApi.Host子项目中添加)

    <PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" Version="8.1.4" />

然后在对应的XXXHttpApiHostModule.cs文件添加如下代码

    /// <summary>
    /// 
    /// </summary>
    [DependsOn(
        typeof(XXXApplicationModule),
        typeof(AbpAspNetCoreMultiTenancyModule),
        typeof(XXXEntityFrameworkCoreModule),
        typeof(AbpAutofacModule),
        typeof(AbpSwashbuckleModule)
        )]
    public class XXXHttpApiHostModule : AbpModule

然后在本文件的ConfigureServices的函数中修改下配置,如下
 

            context.Services.Configure<AbpMultiTenancyOptions>(options =>
            {
                options.IsEnabled = true;
            });

然后在对应的OnApplicationInitialization中启用中间件

            app.UseMultiTenancy();

添加租户

查看文档,租户信息有多种方式添加,你可以使用一个数据库表,也可以使用appsettings.json配置,或者代码配置

这里使用appsettings.json配置,如下

  "Tenants": [
    {
      "Id": "446a5211-3d72-4339-9adc-845151f8ada0",
      "Name": "bbc1",
      "NormalizedName": "team1"
    },
    {
      "Id": "446a5212-3d72-4339-9adc-845151f8ada0",
      "Name": "bbc2",
      "NormalizedName": "team2"
    },
    {
      "Id": "446a4012-3d72-4339-9adc-845151f8ada0",
      "Name": "bbc3",
      "NormalizedName": "team3"
    }
  ]

为表添加租户信息

    /// <summary>
    /// 
    /// </summary>
    public class FrontTable:Entity<int>,IMultiTenant
    {

        /// <summary>
        /// 
        /// </summary>
        [MaxLength(32)]
        public string Name { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public DateTime Sdate { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public DateTime Edate { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public int Age { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public Guid? TenantId { get; set; }
    }

看上面,关键在于IMultiTenant,表示对这个表FrontTable添加多租户信息

数据写入

一条信息,在写入的时候,需要使用哪个租户?看文档

Default Tenant Resolvers
The following resolvers are provided and configured by default;

CurrentUserTenantResolveContributor: Gets the tenant id from claims of the current user, if the current user has logged in. This should always be the first contributor for the security.
QueryStringTenantResolveContributor: Tries to find current tenant id from query string parameters. The parameter name is __tenant by default.
RouteTenantResolveContributor: Tries to find current tenant id from route (URL path). The variable name is __tenant by default. If you defined a route with this variable, then it can determine the current tenant from the route.
HeaderTenantResolveContributor: Tries to find current tenant id from HTTP headers. The header name is __tenant by default.
CookieTenantResolveContributor: Tries to find current tenant id from cookie values. The cookie name is __tenant by default.
ABP 在 Volo.Abp.AspNetCore.MultiTenancy 模块当中还提供了其他几种解析器,他们的作用分别如下。

解析器类型	作用	优先级
QueryStringTenantResolveContributor	通过 Query String 的 __tenant 参数确认租户。	2
RouteTenantResolveContributor	通过路由判断当前租户。	3
HeaderTenantResolveContributor	通过 Header 里面的 __tenant 确认租户。	4
CookieTenantResolveContributor	通过携带的 Cookie 确认租户。	5
DomainTenantResolveContributor	二级域名解析器,通过二级域名确定租户。	第二

理解下就是基于客户端或者访问的信息,服务端读取后,确定当前的租户IcurrentTenant信息是多少在查询或者写入的时候,附带的租户ID信息由此而来!

查询全部

在同数据库中,加入我们查询数据,不是查询当前租户的,要查询所有的,由于PasteTemplate使用的是DbContext模式,则有如下查询案例

        /// <summary>
        /// 按页获取
        ///</summary>
        /// <param name="page">页码</param>
        /// <param name="size">页大小</param>
        /// <returns></returns>
        [HttpGet]
        public async Task<PagedResultDto<FrontTableListDto>> GetListAsync(int page = 1, int size = 20)
        {
            var _data = LazyServiceProvider.LazyGetRequiredService<IDataFilter>();
            //忽略多租户,也就是全部查询
            using (_data.Disable<IMultiTenant>())
            {
                var query = _dbContext.FrontTable.Where(t => 1 == 1);
                var _pagedto = new PagedResultDto<FrontTableListDto>();
                if (page == 1)
                {
                    _pagedto.TotalCount = await query.CountAsync();
                }
                var userList = await query
                    .OrderByDescending(xy => xy.Id)
                    .Page(page, size)
                    .ToListAsync();
                var temList = ObjectMapper.Map<List<FrontTable>, List<FrontTableListDto>>(userList);
                _pagedto.Items = temList;
                return _pagedto;
            }

            //更换租户存储!
            //using (CurrentTenant.Change(tenantId))
            //{
            //    xxxxxxxxxx对应的代码
            //}

        }

关键点在上面的using代码块IDataFilter.Disable<IMultiTenant>

如果要查询其他对应的租户内的信息??
则可以使用注释行的代码案例!

那么问题来了?如何查询指定的多租户的信息???

注意要点

添加租户信息后,读取数据的时候提示找不到这个租户信息?

查看源码中,查找租户不单单可以基于ID,还可以基于Name和NormalizedName,如果你配置的name为abc,那么你多半会获取失败,因为这个abc被命中为Id了(Guid)!!!

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值