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)!!!