Пользовательский фильтр с EF Core - PullRequest
0 голосов
/ 23 января 2019

Я нашел здесь несколько ответов на эту тему, но они не полностью охватывают мой вопрос. Моя цель - сделать так, чтобы у лица был пользователь в качестве владельца. Я определяю интерфейс IMustHaveUser

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

Затем я реализую это в своей сущности. Продукт

Я регистрирую пользовательский фильтр в EFCoreModule в методе preinitialize

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

}

Мой вопрос о настройке текущего идентификатора пользователя. Есть ли другой самый простой (лучший) способ сделать это?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

в конце концов я сделал это по-другому, потому что этот способ усложнил этот код для интеграционных тестов.Я не знаю, почему документация отсутствует в этот момент, мне пришлось читать исходники из 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;
    }
0 голосов
/ 24 января 2019

Я забыл про 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));


        }
    }
...