首页 > 解决方案 > 为 AspNetBoilerPlate 中主机的租户添加一个实体的默认值

问题描述

场景:
我的多租户项目基于 ASPNetBoilerPlate。
我有一个“WORK”实体,它是 IMayHaveTenant。每个租户都必须看到 HOST 中的默认作品以及他的作品。我必须怎么做?
我需要一些代码,例如:tenantId == id || tenantId is null

错误答案

using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant)){    }

这也会返回其他租户的作品。

标签: multi-tenantaspnetboilerplate

解决方案


创建一个接口,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;
}

推荐阅读