在ASP.NET Core中实现OrganizationUnitfilter
在ASP.NET Boilerplate中,有像Tenantfilter这样的内置数据filter,我们可以使用SetTenantId
来启用查询特定的tenantId
。
根据官方文档,与EF 6.x不同,它不支持EF Core中的自定义Filter
。
我想知道如何为OrganizationUnitId
参数实现类似的filter。
这是我到目前为止所做的:
-
覆盖
CreateFilterExpression
:protected override Expression<Func> CreateFilterExpression() { Expression<Func> expression = null; if (typeof(IMayHaveOrganizationUnit).IsAssignableFrom(typeof(TEntity))) { Expression<Func> mayHaveOUFilter = e => ((IMayHaveOrganizationUnit)e).OrganizationUnitId == CurrentOrganizationUnitId || (((IMayHaveOrganizationUnit)e).OrganizationUnitId == CurrentOrganizationUnitId) == IsMayHaveOrganizationUnitFilterEnabled; expression = expression == null ? mayHaveOUFilter : CombineExpressions(expression, mayHaveOUFilter); } expression = expression == null ? base.CreateFilterExpression() : CombineExpressions(expression, base.CreateFilterExpression()); return expression; }
-
我通过以下代码注册新filter:
Configuration.UnitOfWork.RegisterFilter("MayHaveOrganizationUnit", true);
但是,我如何实现代码来设置OrganizationUnitId
?
SetTenantId
用于配置tenantId
,如何从UnitOfWork
配置OrganizationUnitId
?
-
我尝试inheritance
ClaimsAbpSession
如下所示:public class CustomAbpSession : ClaimsAbpSession, ICustomAbpSession { private readonly IRepository _userRepository; public CustomAbpSession( IRepository userRepository, IPrincipalAccessor principalAccessor, IMultiTenancyConfig multiTenancy, ITenantResolver tenantResolver, IAmbientScopeProvider 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(DependencyLifeStyle.Transient); });
用法:
public List GetAll() { using (CurrentUnitOfWork.SetFilterParameter("MayHaveOrganizationUnit", "OrganizationUnitId", 2)) { return _productRepositry.GetAll().ToList(); } }
但是,它始终从CustomAbpSession
OrganizationUnitId
返回值,此方法CurrentUnitOfWork.SetFilterParameter
未将值设置为filter。
这不仅仅是几行代码。
首先介绍如何在CreateFilterExpression
过滤IMayHaveTenant
。
您可以在DbContext
覆盖ShouldFilterEntity
和CreateFilterExpression
。
SetTenantId
用于配置tenantId,如何从UnitOfWork
配置OrganizationUnitId
?
您可以使用等效的SetFilterParameter
方法。
但是,它始终从
CustomAbpSession
OrganizationUnitId
返回值,此方法CurrentUnitOfWork.SetFilterParameter
未将值设置为filter。
从CurrentUnitOfWorkProvider.Current
,您可以访问Filters
:
上述就是C#学习教程:在ASP.NET Core中实现OrganizationUnitfilter分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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; }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1005211.html