From 3e3fcf95800f90c89a7c7f96c6c8585a4e085acd Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 24 Jul 2024 03:27:31 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E7=A7=BB=E9=99=A4=20IBaseRepository=20Data?= =?UTF-8?q?Filter=20=E4=BB=93=E5=82=A8=E8=BF=87=E6=BB=A4=E5=99=A8=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 29 +- .../ContextSet/RepositoryDbContext.cs | 14 - .../Repository/ContextSet/RepositoryDbSet.cs | 23 -- .../Repository/DataFilter/DataFilter.cs | 278 ------------------ .../Repository/DataFilter/DataFilterUtil.cs | 104 ------- .../Extensions/DependencyInjection.cs | 10 +- .../Repository/Repository/BaseRepository.cs | 15 - .../Repository/Repository/IBaseRepository.cs | 1 - 8 files changed, 2 insertions(+), 472 deletions(-) delete mode 100644 FreeSql.DbContext/Repository/DataFilter/DataFilter.cs delete mode 100644 FreeSql.DbContext/Repository/DataFilter/DataFilterUtil.cs diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 197e6480..0f686a1e 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -533,32 +533,6 @@ 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository - - - 开启过滤器,若使用 using 则使用完后,恢复为原有状态 - - 过滤器名称 - - - - - 开启所有过滤器,若使用 using 则使用完后,恢复为原有状态 - - - - - - 禁用过滤器,若使用 using 则使用完后,恢复为原有状态 - - - - - - - 禁用所有过滤器,若使用 using 则使用完后,恢复为原有状态 - - - 动态Type,在使用 Repository<object> 后使用本方法,指定实体类型 @@ -826,12 +800,11 @@ - + 批量注入 Repository,可以参考代码自行调整 - diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs index be0616a6..702da6ee 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs @@ -37,10 +37,6 @@ namespace FreeSql GetRepositoryDbField(entityType, "_asTablePriv").SetValue(repo, _repo.GetType().GetField("_asTablePriv", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(_repo)); //GetRepositoryDbField(_repo.EntityType, "_asTablePriv").GetValue(_repo)); - - if (typeof(IBaseRepository<>).MakeGenericType(_repo.EntityType).IsAssignableFrom(_repo.GetType())) - typeof(RepositoryDbContext).GetMethod("SetRepositoryDataFilter").MakeGenericMethod(_repo.EntityType) - .Invoke(null, new object[] { repo, _repo }); } var sd = Activator.CreateInstance(typeof(RepositoryDbSet<>).MakeGenericType(entityType), repo) as IDbSet; @@ -49,16 +45,6 @@ namespace FreeSql return sd; } - public static void SetRepositoryDataFilter(object repo, IBaseRepository baseRepo) where TEntity : class - { - var filter = baseRepo.DataFilter as DataFilter; - DataFilterUtil.SetRepositoryDataFilter(repo, fl => - { - foreach (var f in filter._filters) - fl.Apply(f.Key, f.Value.Expression); - }); - } - int SaveChangesSuccess() { int ret; diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs index cf3a4e4f..ddec4925 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs @@ -32,11 +32,6 @@ namespace FreeSql { var select = base.OrmSelect(dywhere); if (_repo._asTablePriv != null) select.AsTable(_repo._asTablePriv); - var filters = (_repo.DataFilter as DataFilter)._filters; - foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) select.Where(filter.Value.Expression); - var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList(); - disableFilter.AddRange((_repo.DataFilter as DataFilter)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key)); - if (disableFilter.Any()) select.DisableGlobalFilter(disableFilter.ToArray()); return select; } internal ISelect OrmSelectInternal(object dywhere) => OrmSelect(dywhere); @@ -44,11 +39,6 @@ namespace FreeSql { var update = base.OrmUpdate(entitys); if (_repo._asTablePriv != null) update.AsTable(old => _repo._asTablePriv(_entityType, old)); - var filters = (_repo.DataFilter as DataFilter)._filters; - foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) update.Where(filter.Value.Expression); - var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList(); - disableFilter.AddRange((_repo.DataFilter as DataFilter)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key)); - if (disableFilter.Any()) update.DisableGlobalFilter(disableFilter.ToArray()); return update; } internal IUpdate OrmUpdateInternal(IEnumerable entitys) => OrmUpdate(entitys); @@ -56,11 +46,6 @@ namespace FreeSql { var delete = base.OrmDelete(dywhere); if (_repo._asTablePriv != null) delete.AsTable(old => _repo._asTablePriv(_entityType, old)); - var filters = (_repo.DataFilter as DataFilter)._filters; - foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) delete.Where(filter.Value.Expression); - var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList(); - disableFilter.AddRange((_repo.DataFilter as DataFilter)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key)); - if (disableFilter.Any()) delete.DisableGlobalFilter(disableFilter.ToArray()); return delete; } internal IDelete OrmDeleteInternal(object dywhere) => OrmDelete(dywhere); @@ -77,14 +62,6 @@ namespace FreeSql { var insert = base.OrmInsert(entitys); if (_repo._asTablePriv != null) insert.AsTable(old => _repo._asTablePriv(_entityType, old)); - var filters = (_repo.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); - foreach (var filter in filters) - { - if (entitys != null) - foreach (var entity in entitys) - if (filter.Value.ExpressionDelegate?.Invoke(entity) == false) - throw new Exception(DbContextStrings.InsertError_Filter(filter.Key, filter.Value.Expression, _db.OrmOriginal.GetEntityString(_entityType, entity))); - } return insert; } internal IInsert OrmInsertInternal(TEntity entity) => OrmInsert(entity); diff --git a/FreeSql.DbContext/Repository/DataFilter/DataFilter.cs b/FreeSql.DbContext/Repository/DataFilter/DataFilter.cs deleted file mode 100644 index 17db52ca..00000000 --- a/FreeSql.DbContext/Repository/DataFilter/DataFilter.cs +++ /dev/null @@ -1,278 +0,0 @@ -using FreeSql.Internal; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; - -namespace FreeSql -{ - public interface IDataFilter : IDisposable where TEntity : class - { - - IDataFilter Apply(string filterName, Expression> filterAndValidateExp); - - /// - /// 开启过滤器,若使用 using 则使用完后,恢复为原有状态 - /// - /// 过滤器名称 - /// - IDisposable Enable(params string[] filterName); - /// - /// 开启所有过滤器,若使用 using 则使用完后,恢复为原有状态 - /// - /// - IDisposable EnableAll(); - - /// - /// 禁用过滤器,若使用 using 则使用完后,恢复为原有状态 - /// - /// - /// - IDisposable Disable(params string[] filterName); - /// - /// 禁用所有过滤器,若使用 using 则使用完后,恢复为原有状态 - /// - /// - IDisposable DisableAll(); - - bool IsEnabled(string filterName); - } - - internal class DataFilter : IDataFilter where TEntity : class - { - - internal class FilterItem - { - public Expression> Expression { get; set; } - Func _expressionDelegate; - public Func ExpressionDelegate => _expressionDelegate ?? (_expressionDelegate = Expression?.Compile()); - public bool IsEnabled { get; set; } - } - internal class FilterItemByOrm - { - public GlobalFilter.Item Filter { get; set; } - public bool IsEnabled { get; set; } - } - - internal ConcurrentDictionary _filters = new ConcurrentDictionary(StringComparer.CurrentCultureIgnoreCase); - internal ConcurrentDictionary _filtersByOrm = new ConcurrentDictionary(StringComparer.CurrentCultureIgnoreCase); - public IDataFilter Apply(string filterName, Expression> filterAndValidateExp) - { - - if (filterName == null) - throw new ArgumentNullException(nameof(filterName)); - if (filterAndValidateExp == null) return this; - - var filterItem = new FilterItem { Expression = filterAndValidateExp, IsEnabled = true }; - _filters.AddOrUpdate(filterName, filterItem, (k, v) => filterItem); - return this; - } - - public IDisposable Disable(params string[] filterName) - { - if (filterName == null || filterName.Any() == false) return new UsingAny(() => { }); - - List restore = new List(); - List restoreByOrm = new List(); - foreach (var name in filterName) - { - if (_filters.TryGetValue(name, out var tryfi)) - { - if (tryfi.IsEnabled) - { - restore.Add(name); - tryfi.IsEnabled = false; - } - } - if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm)) - { - if (tryfiByOrm.IsEnabled) - { - restoreByOrm.Add(name); - tryfiByOrm.IsEnabled = false; - } - } - } - return new UsingAny(() => - { - restore.ForEach(name => - { - if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == false) - tryfi.IsEnabled = true; - }); - restoreByOrm.ForEach(name => - { - if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == false) - tryfiByOrm.IsEnabled = true; - }); - }); - } - public IDisposable DisableAll() - { - List restore = new List(); - List restoreByOrm = new List(); - foreach (var val in _filters) - { - if (val.Value.IsEnabled) - { - restore.Add(val.Key); - val.Value.IsEnabled = false; - } - } - foreach (var val in _filtersByOrm) - { - if (val.Value.IsEnabled) - { - restoreByOrm.Add(val.Key); - val.Value.IsEnabled = false; - } - } - return new UsingAny(() => - { - restore.ForEach(name => - { - if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == false) - tryfi.IsEnabled = true; - }); - restoreByOrm.ForEach(name => - { - if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == false) - tryfiByOrm.IsEnabled = true; - }); - }); - } - class UsingAny : IDisposable - { - Action _ondis; - public UsingAny(Action ondis) - { - _ondis = ondis; - } - public void Dispose() - { - _ondis?.Invoke(); - } - } - - public IDisposable Enable(params string[] filterName) - { - if (filterName == null || filterName.Any() == false) return new UsingAny(() => { }); - - List restore = new List(); - List restoreByOrm = new List(); - foreach (var name in filterName) - { - if (_filters.TryGetValue(name, out var tryfi)) - { - if (tryfi.IsEnabled == false) - { - restore.Add(name); - tryfi.IsEnabled = true; - } - } - if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm)) - { - if (tryfiByOrm.IsEnabled == false) - { - restoreByOrm.Add(name); - tryfiByOrm.IsEnabled = true; - } - } - } - return new UsingAny(() => - { - restore.ForEach(name => - { - if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == true) - tryfi.IsEnabled = false; - }); - restoreByOrm.ForEach(name => - { - if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == true) - tryfiByOrm.IsEnabled = false; - }); - }); - } - public IDisposable EnableAll() - { - List restore = new List(); - List restoreByOrm = new List(); - foreach (var val in _filters) - { - if (val.Value.IsEnabled == false) - { - restore.Add(val.Key); - val.Value.IsEnabled = true; - } - } - foreach (var val in _filtersByOrm) - { - if (val.Value.IsEnabled == false) - { - restoreByOrm.Add(val.Key); - val.Value.IsEnabled = true; - } - } - return new UsingAny(() => - { - restore.ForEach(name => - { - if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == true) - tryfi.IsEnabled = false; - }); - restoreByOrm.ForEach(name => - { - if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == true) - tryfiByOrm.IsEnabled = false; - }); - }); - } - - public bool IsEnabled(string filterName) - { - if (filterName == null) return false; - return _filters.TryGetValue(filterName, out var tryfi) ? tryfi.IsEnabled : - _filtersByOrm.TryGetValue(filterName, out var tryfiByOrm) ? tryfiByOrm.IsEnabled : false; - } - - ~DataFilter() => this.Dispose(); - public void Dispose() - { - _filters.Clear(); - } - } - - public class FluentDataFilter : IDisposable - { - internal class FilterInfo - { - public Type type { get; } - public string name { get; } - public LambdaExpression exp { get; } - public FilterInfo(Type type, string name, LambdaExpression exp) - { - this.type = type; - this.name = name; - this.exp = exp; - } - } - internal List _filters = new List(); - - public FluentDataFilter Apply(string filterName, Expression> filterAndValidateExp) where TEntity : class - { - if (filterName == null) - throw new ArgumentNullException(nameof(filterName)); - if (filterAndValidateExp == null) return this; - - _filters.Add(new FilterInfo(typeof(TEntity), filterName, filterAndValidateExp)); - return this; - } - - ~FluentDataFilter() => this.Dispose(); - public void Dispose() - { - _filters.Clear(); - } - } -} diff --git a/FreeSql.DbContext/Repository/DataFilter/DataFilterUtil.cs b/FreeSql.DbContext/Repository/DataFilter/DataFilterUtil.cs deleted file mode 100644 index ee5abb79..00000000 --- a/FreeSql.DbContext/Repository/DataFilter/DataFilterUtil.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; - -namespace FreeSql -{ - - internal class DataFilterUtil - { - - internal static Action _globalDataFilter; - - static ConcurrentDictionary _dicSetRepositoryDataFilterApplyDataFilterFunc = new ConcurrentDictionary(); - static ConcurrentDictionary> _dicSetRepositoryDataFilterConvertFilterNotExists = new ConcurrentDictionary>(); - internal static void SetRepositoryDataFilter(object repos, Action scopedDataFilter) - { - if (scopedDataFilter != null) - { - SetRepositoryDataFilter(repos, null); - } - if (scopedDataFilter == null) - { - scopedDataFilter = _globalDataFilter; - } - if (scopedDataFilter == null) return; - using (var globalFilter = new FluentDataFilter()) - { - scopedDataFilter(globalFilter); - - var type = repos.GetType(); - Type entityType = (repos as IBaseRepository).EntityType; - if (entityType == null) throw new Exception(DbContextStrings.FailedSetFilter_NotBelongIRpository); - - var notExists = _dicSetRepositoryDataFilterConvertFilterNotExists.GetOrAdd(type, t => new ConcurrentDictionary()); - var newFilter = new Dictionary(); - foreach (var gf in globalFilter._filters) - { - if (notExists.ContainsKey(gf.name)) continue; - - LambdaExpression newExp = null; - var filterParameter1 = Expression.Parameter(entityType, gf.exp.Parameters[0].Name); - try - { - newExp = Expression.Lambda( - typeof(Func<,>).MakeGenericType(entityType, typeof(bool)), - new ReplaceVisitor().Modify(gf.exp.Body, filterParameter1), - filterParameter1 - ); - } - catch - { - notExists.TryAdd(gf.name, true); //防止第二次错误 - continue; - } - newFilter.Add(gf.name, newExp); - } - if (newFilter.Any() == false) return; - - var del = _dicSetRepositoryDataFilterApplyDataFilterFunc.GetOrAdd(type, t => - { - var reposParameter = Expression.Parameter(type); - var nameParameter = Expression.Parameter(typeof(string)); - var expressionParameter = Expression.Parameter( - typeof(Expression<>).MakeGenericType(typeof(Func<,>).MakeGenericType(entityType, typeof(bool))) - ); - return Expression.Lambda( - Expression.Block( - Expression.Call(reposParameter, type.GetMethod("ApplyDataFilter", BindingFlags.Instance | BindingFlags.NonPublic), nameParameter, expressionParameter) - ), - new[] { - reposParameter, nameParameter, expressionParameter - } - ).Compile(); - }); - foreach (var nf in newFilter) - { - del.DynamicInvoke(repos, nf.Key, nf.Value); - } - newFilter.Clear(); - } - } - } - - class ReplaceVisitor : ExpressionVisitor - { - private ParameterExpression parameter; - - public Expression Modify(Expression expression, ParameterExpression parameter) - { - this.parameter = parameter; - return Visit(expression); - } - - protected override Expression VisitMember(MemberExpression node) - { - if (node.Expression?.NodeType == ExpressionType.Parameter) - return Expression.Property(parameter, node.Member.Name); - return base.VisitMember(node); - } - } -} diff --git a/FreeSql.DbContext/Repository/Extensions/DependencyInjection.cs b/FreeSql.DbContext/Repository/Extensions/DependencyInjection.cs index 087f176d..6d2915bd 100644 --- a/FreeSql.DbContext/Repository/Extensions/DependencyInjection.cs +++ b/FreeSql.DbContext/Repository/Extensions/DependencyInjection.cs @@ -13,18 +13,10 @@ namespace Microsoft.Extensions.DependencyInjection /// 批量注入 Repository,可以参考代码自行调整 /// /// - /// /// /// - public static IServiceCollection AddFreeRepository(this IServiceCollection services, Action globalDataFilter = null, params Assembly[] assemblies) + public static IServiceCollection AddFreeRepository(this IServiceCollection services, params Assembly[] assemblies) { - if (globalDataFilter != null) - { - DataFilterUtil._globalDataFilter = globalDataFilter; - //如果看到了这里的代码,想自己调整,但因为 _globalDataFilter 是内部属性,无法修改? - //请考虑改用 fsql.GlobalFilter.Apply - } - services.AddScoped(typeof(IBaseRepository<>), typeof(GuidRepository<>)); services.AddScoped(typeof(BaseRepository<>), typeof(GuidRepository<>)); diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index e9911438..b5618ea7 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -17,26 +17,12 @@ namespace FreeSql internal RepositoryDbSet _dbsetPriv; internal RepositoryDbSet _dbset => _dbsetPriv ?? (_dbsetPriv = _db.Set() as RepositoryDbSet); - public IDataFilter DataFilter { get; } = new DataFilter(); internal Func _asTablePriv; - protected void ApplyDataFilter(string name, Expression> exp) => DataFilter.Apply(name, exp); - protected BaseRepository(IFreeSql fsql, Expression> filter, Func asTable = null) { _ormScoped = DbContextScopedFreeSql.Create(fsql, () => _db, () => UnitOfWork); - DataFilterUtil.SetRepositoryDataFilter(this, null); - DataFilter.Apply("", filter); AsTable(asTable); - - fsql?.GlobalFilter?.GetAllFilters().ForEach(gf => - { - (DataFilter as DataFilter)._filtersByOrm.TryAdd(gf.Name, new DataFilter.FilterItemByOrm - { - Filter = gf, - IsEnabled = true - }); - }); } ~BaseRepository() => this.Dispose(); @@ -48,7 +34,6 @@ namespace FreeSql { _dbsetPriv?.Dispose(); _dbPriv?.Dispose(); - this.DataFilter?.Dispose(); } finally { diff --git a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs index 695ed247..fafd783a 100644 --- a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs @@ -39,7 +39,6 @@ namespace FreeSql public interface IBaseRepository : IBaseRepository where TEntity : class { - IDataFilter DataFilter { get; } ISelect Select { get; } ISelect Where(Expression> exp);