【发布时间】:2018-04-21 13:07:18
【问题描述】:
在 ASP.NET Boilerplate 中,有内置的数据过滤器,如租户过滤器,我们可以使用SetTenantId 来启用查询特定的tenantId。
根据官方文档,它不支持在 EF Core 中自定义Filter,这与 EF 6.x 不同。
我想知道如何为OrganizationUnitId 参数实现类似的过滤器。
这是我到目前为止所做的:
-
覆盖
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; } -
我通过以下代码注册新过滤器:
Configuration.UnitOfWork.RegisterFilter("MayHaveOrganizationUnit", true);
但是,如何实现代码来设置OrganizationUnitId?
SetTenantId是用来配置tenantId的,怎么从UnitOfWork配置OrganizationUnitId?
-
我尝试继承
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; } -
使用下面的代码注册自定义
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