使用EF Core自定义过滤器

问题描述 投票:0回答:2

我在这里找到了关于这个主题的答案,但它们并没有完全涵盖我的问题。我的目标是让实体将用户作为所有者。我定义了一个接口IMustHaveUser

public interface IMustHaveUser
{
    long UserId { get; set; }
}

然后我在我的实体产品中实现它

我在preinitialize方法中注册了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。还有其他最简单(更好)的方法吗?

aspnetboilerplate
2个回答
1
投票

我忘记了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));


        }
    }

0
投票

最后我以其他方式做到了,因为这种方式使得这些代码难以进行集成测试。我不知道为什么文档会遗漏这一刻,我不得不从github读取源代码以了解现有过滤器的工作原理,例如MustHaveTenant等。我在AbpDbContext中找到了名为ApplyAbpConceptsForAddedEntity的多态方法,允许我实现它。

MyDbContext中的最终代码如下所示:

    protected override void ApplyAbpConceptsForAddedEntity(EntityEntry entry, long? userId, EntityChangeReport changeReport)
    {
        CheckAndSetMustHaveUserIdProperty(entry.Entity, userId);
        base.ApplyAbpConceptsForAddedEntity(entry, userId, changeReport);
    }

    private void CheckAndSetMustHaveUserIdProperty(object entryEntity, long? userId)
    {
        if (userId == null)
            return;


        if (!(entryEntity is IMustHaveUser))
        {
            return;
        }

        var entity = entryEntity.As<IMustHaveUser>();


        entity.UserId = userId.Value;
    }
© www.soinside.com 2019 - 2024. All rights reserved.