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子项目中添加)

    

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

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

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

            context.Services.Configure(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"
    }
  ]

为表添加租户信息

    /// 
    /// 
    /// 
    public class FrontTable:Entity,IMultiTenant
    {

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

        /// 
        /// 
        /// 
        public DateTime Sdate { get; set; }

        /// 
        /// 
        /// 
        public DateTime Edate { get; set; }

        /// 
        /// 
        /// 
        public int Age { get; set; }

        /// 
        /// 
        /// 
        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模式,则有如下查询案例

        /// 
        /// 按页获取
        ///
        /// 页码
        /// 页大小
        /// 
        [HttpGet]
        public async Task> GetListAsync(int page = 1, int size = 20)
        {
            var _data = LazyServiceProvider.LazyGetRequiredService();
            //忽略多租户,也就是全部查询
            using (_data.Disable())
            {
                var query = _dbContext.FrontTable.Where(t => 1 == 1);
                var _pagedto = new PagedResultDto();
                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>(userList);
                _pagedto.Items = temList;
                return _pagedto;
            }

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

        }

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

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

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

注意要点

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

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

你可能感兴趣的:(.net,Core,ABP,PasteTemplate)