multi-tenant - 为 AspNetBoilerPlate 中主机的租户添加一个实体的默认值
问题描述
场景:
我的多租户项目基于 ASPNetBoilerPlate。
我有一个“WORK”实体,它是 IMayHaveTenant。每个租户都必须看到 HOST 中的默认作品以及他的作品。我必须怎么做?
我需要一些代码,例如:tenantId == id || tenantId is null
错误答案:
using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant)){ }
这也会返回其他租户的作品。
解决方案
创建一个接口,IMayHaveTenant
如果您想要其他内置功能,请继承:
public interface IMayHaveTenantSharedWithHost : IMayHaveTenant
{
}
实现该接口:
public class Work : Entity, IMayHaveTenantSharedWithHost
{
public int? TenantId { get; set; }
// ...
}
CreateFilterExpression
在您的子类中覆盖AbpDbContext
并处理该接口:
protected override Expression<Func<TEntity, bool>> CreateFilterExpression<TEntity>()
where TEntity : class
{
Expression<Func<TEntity, bool>> expression = null;
if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)))
{
Expression<Func<TEntity, bool>> softDeleteFilter = e => !IsSoftDeleteFilterEnabled || !((ISoftDelete) e).IsDeleted;
expression = expression == null ? softDeleteFilter : CombineExpressions(expression, softDeleteFilter);
}
// if (typeof(IMayHaveTenant).IsAssignableFrom(typeof(TEntity)))
if (typeof(IMayHaveTenantSharedWithHost).IsAssignableFrom(typeof(TEntity)))
{
Expression<Func<TEntity, bool>> mayHaveTenantFilter = e => !IsMayHaveTenantFilterEnabled || ((IMayHaveTenant)e).TenantId == CurrentTenantId || ((IMayHaveTenant)e).TenantId == null;
expression = expression == null ? mayHaveTenantFilter : CombineExpressions(expression, mayHaveTenantFilter);
}
else if (typeof(IMayHaveTenant).IsAssignableFrom(typeof(TEntity)))
{
Expression<Func<TEntity, bool>> mayHaveTenantFilter = e => !IsMayHaveTenantFilterEnabled || ((IMayHaveTenant)e).TenantId == CurrentTenantId;
expression = expression == null ? mayHaveTenantFilter : CombineExpressions(expression, mayHaveTenantFilter);
}
if (typeof(IMustHaveTenant).IsAssignableFrom(typeof(TEntity)))
{
Expression<Func<TEntity, bool>> mustHaveTenantFilter = e => !IsMustHaveTenantFilterEnabled || ((IMustHaveTenant)e).TenantId == CurrentTenantId;
expression = expression == null ? mustHaveTenantFilter : CombineExpressions(expression, mustHaveTenantFilter);
}
return expression;
}
推荐阅读
- python - 如何使用我的本地 python 安装在远程服务器上运行本地脚本?
- javascript - 将鼠标悬停在子 ul 子菜单上时,li 菜单标题隐藏
- amazon-dynamodb - dynamodb 查询以选择与一组值匹配的所有项目
- outlook - Outlook 显示 iCal 日期已更改,尽管它是同一日期
- spring-boot - ZooKeeper 最新值不会在不重新启动服务器的情况下重新加载
- keycloak - 密钥斗篷授权
- angular - Angular 7等待所有订阅
- c - 分段错误内存转储
- java - 在 actionlistener 中更改变量数据
- mysql - 如何让mysql查询更快