aspnetboilerplate - 使用 EF Core 的自定义过滤器
问题描述
我在这里找到了关于这个主题的几个答案,但它们并没有完全涵盖我的问题。我的目标是让实体拥有用户作为所有者。我定义了一个接口 IMustHaveUser
public interface IMustHaveUser
{
long UserId { get; set; }
}
然后我在我的实体产品中实现它
我在预初始化方法中在 EFCoreModule 中注册自定义过滤器
public override void PreInitialize() {
//Register custom data filters
Configuration.UnitOfWork.RegisterFilter("MustHaveUser", true);
//other code here...
}
最后在 DBContext 中设置我的过滤器定义一个检查过滤器是否启用的属性
protected virtual bool IsMustHaveUserFilterEnabled => CurrentUnitOfWorkProvider?.Current?.IsFilterEnabled("MustHaveUser") == true;
并覆盖 CreateFilterExpression 方法。
protected override Expression<Func<TEntity, bool>> CreateFilterExpression<TEntity>()
{
var expression = base.CreateFilterExpression<TEntity>();
if (typeof(IMustHaveUser).IsAssignableFrom(typeof(TEntity)))
{
Expression<Func<TEntity, bool>> userFilter = e => ((IMustHaveUser) e).UserId == AbpSession.UserId || (((IMustHaveUser) e).UserId == AbpSession.UserId) == IsMustHaveUserFilterEnabled;
expression = expression == null ? userFilter : CombineExpressions(expression, userFilter);
}
return expression;
}
现在,当我创建实体时,我必须手动设置 UserID。基本上我用方法在领域层写了 ProductManager
void Create(Product product, UserIdentity user){
product.UserId = user.UserId;
//Other business rules and insert with repository
}
我的问题是要设置当前的 UserId。还有其他最简单(更好)的方法吗?
解决方案
我忘了DI。找到了解决方案。基本上我已经将 IAbpSession 注入 Automapper 配置文件并在那里映射 UserId。
public class AutoMapperProfile : AutoMapper.Profile
{
private IAbpSession _abpSession;
public AutoMapperProfile() {
_abpSession = IocManager.Instance.Resolve<IAbpSession>();
CreateMap<LicenseInput, License>()
.ForMember(x => x.UserId, options => options.MapFrom(src => _abpSession.UserId));
}
}
推荐阅读
- python - 使用 python 脚本从数据库中选择值时,行数始终打印为 -1
- android - 如何以编程方式共享来自 Android 应用程序的特定 1 卡活动视图,例如 Google Analytics 应用程序
- c++ - C ++中相同基础对象的多个键
- javascript - Java Script中函数和命名函数表达式的代码性能和区别
- openldap - 在 openldap 中更改用户的 pwdChangedTime 属性
- mysql - 如何将同一表中的总值显示为一行(在case语句中)?
- java - 带有自定义登录的 Spring Security LDAP 身份验证
- c# - 未经管理员同意,为用户获取所有驱动器,包括来自站点的驱动器
- java - 即使在 HQL 查询中使用 Join Fetch,Hibernate 延迟初始化异常
- servlets - Jsp 动作表单