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);