【问题标题】:Implement OrganizationUnit filter in ASP.NET Core在 ASP.NET Core 中实现 OrganizationUnit 过滤器
【发布时间】:2018-04-21 13:07:18
【问题描述】:

在 ASP.NET Boilerplate 中,有内置的数据过滤器,如租户过滤器,我们可以使用SetTenantId 来启用查询特定的tenantId

根据官方文档,它不支持在 EF Core 中自定义Filter,这与 EF 6.x 不同。

我想知道如何为OrganizationUnitId 参数实现类似的过滤器。

这是我到目前为止所做的:

  1. 覆盖CreateFilterExpression

    protected override Expression<Func<TEntity, bool>> CreateFilterExpression<TEntity>()
    {
        Expression<Func<TEntity, bool>> expression = null;
        if (typeof(IMayHaveOrganizationUnit).IsAssignableFrom(typeof(TEntity)))
        {
            Expression<Func<TEntity, bool>> mayHaveOUFilter = e => ((IMayHaveOrganizationUnit)e).OrganizationUnitId == CurrentOrganizationUnitId || (((IMayHaveOrganizationUnit)e).OrganizationUnitId == CurrentOrganizationUnitId) == IsMayHaveOrganizationUnitFilterEnabled;
            expression = expression == null ? mayHaveOUFilter : CombineExpressions(expression, mayHaveOUFilter);
        }
    
        expression = expression == null ? base.CreateFilterExpression<TEntity>() : CombineExpressions(expression, base.CreateFilterExpression<TEntity>());
    
        return expression;
    }
    
  2. 我通过以下代码注册新过滤器:

    Configuration.UnitOfWork.RegisterFilter("MayHaveOrganizationUnit", true);
    

但是,如何实现代码来设置OrganizationUnitId

SetTenantId是用来配置tenantId的,怎么从UnitOfWork配置OrganizationUnitId

  1. 我尝试继承ClaimsAbpSession,如下所示:

    public class CustomAbpSession : ClaimsAbpSession, ICustomAbpSession
    {
        private readonly IRepository<User, long> _userRepository;
    
        public CustomAbpSession(
            IRepository<User, long> userRepository,
            IPrincipalAccessor principalAccessor,
            IMultiTenancyConfig multiTenancy,
            ITenantResolver tenantResolver,
            IAmbientScopeProvider<SessionOverride> sessionOverrideScopeProvider)
            : base(principalAccessor, multiTenancy, tenantResolver, sessionOverrideScopeProvider)
        {
            _userRepository = userRepository;
        }
    
        public virtual long? OrganizationUnitId
        {
            get
            {
                if (UserId != null)
                {
                    var user = _userRepository.Get(UserId.Value);
                    return 1;
                }
    
                return null;
            }
        }
    
        public long? ImpersonatorOrganizationUnitId => throw new NotImplementedException();
    }
    
    protected virtual long? GetCurrentOrganizationUnitIdOrNull()
    {
        return 3; // ((ICustomAbpSession)AbpSession).OrganizationUnitId;
    }
    
  2. 使用下面的代码注册自定义IAbpSession

    Configuration.ReplaceService(typeof(IAbpSession), () =>
    {
        IocManager.Register<IAbpSession, CustomAbpSession>(DependencyLifeStyle.Transient);
    });
    

用法:

public List<Product> GetAll()
{
    using (CurrentUnitOfWork.SetFilterParameter("MayHaveOrganizationUnit", "OrganizationUnitId", 2))
    {
        return _productRepositry.GetAll().ToList();
    }
}

但是,它总是从CustomAbpSession中的OrganizationUnitId返回值,这个方法CurrentUnitOfWork.SetFilterParameter没有将值设置为过滤器。

【问题讨论】:

    标签: c# asp.net-core filter aspnetboilerplate ef-core-2.0


    【解决方案1】:

    这不仅仅是几行代码。

    IMayHaveTenantCreateFilterExpression 中的过滤方式开始。

    您可以在您的DbContext 中覆盖ShouldFilterEntityCreateFilterExpression

    SetTenantId是用来配置tenantId的,怎么从UnitOfWork配置OrganizationUnitId

    您可以使用等效的SetFilterParameter 方法。

    但是,它总是在CustomAbpSession 中返回来自OrganizationUnitId 的值,这个方法CurrentUnitOfWork.SetFilterParameter 没有将值设置为过滤器。

    CurrentUnitOfWorkProvider.Current,您可以访问Filters

    protected virtual long? GetCurrentOrganizationUnitIdOrNull()
    {
        if (CurrentUnitOfWorkProvider != null &&
            CurrentUnitOfWorkProvider.Current != null)
        {
            return CurrentUnitOfWorkProvider.Current
                .Filters.FirstOrDefault(f => f.FilterName == "MayHaveOrganizationUnit")?
                .FilterParameters["OrganizationUnitId"] as long?;
        }
    
        return ((ICustomAbpSession)AbpSession).OrganizationUnitId;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 2017-05-18
      • 2016-02-06
      • 2018-07-30
      相关资源
      最近更新 更多