Версия 1.2 от Alexandr Fokin на 2026/04/02 19:15

Скрыть последних авторов
Alexandr Fokin 1.1 1 |(% style="width:186px" %) |(% style="width:1247px" %)Возможная реализация идеи фиксации правил в виде отдельных компонентов.
2 |(% style="width:186px" %)Пример компонента для фиксации правила/условия.|(% style="width:1247px" %)(((
3 |(% style="width:88px" %)InMemory condition|(% style="width:1104px" %){{code language="c#"}}public interface IInMemoryCondition<TData, TParameters>
4 {
5 /// <summary>
6 /// Проверить условие.
7 /// </summary>
8 /// <param name="source"></param>
9 /// <returns></returns>
10 bool Check(TData source, TParameters parameters);
11
12 /// <summary>
13 /// Фильтрация для InMemory.
14 /// </summary>
15 /// <param name="source"></param>
16 /// <returns></returns>
17 IEnumerable<TData> ApplayEnumerable(IEnumerable<TData> source, TParameters parameters);
18 }{{/code}}|{{code language="c#"}}public class DelegateInMemoryCondition<TData, TParameters>
19 : IInMemoryCondition<TData, TParameters>
20 {
21 private readonly Func<TData, TParameters, bool> _checkFunc;
22 private readonly Func<IEnumerable<TData>, TParameters, IEnumerable<TData>> _applayEnumerableFunc;
23
24 public DelegateInMemoryCondition(
25 Func<TData, TParameters, bool> checkFunc,
26 Func<IEnumerable<TData>, TParameters, IEnumerable<TData>>? applayEnumerableFunc = null)
27 {
28 _checkFunc = checkFunc;
29 _applayEnumerableFunc = applayEnumerableFunc
30 ?? ((source, parameter) => source.Where(e => Check(e, parameter)));
31 }
32
33 public bool Check(TData source, TParameters parameters)
34 {
35 return _checkFunc(source, parameters);
36 }
37
38 public IEnumerable<TData> ApplayEnumerable(IEnumerable<TData> source, TParameters parameters)
39 {
40 return _applayEnumerableFunc(source, parameters);
41 }
42 }{{/code}}
43 |(% style="width:88px" %)IQueryable condition|(% style="width:1104px" %){{code language="c#"}}public interface IQueryableCondition<TData, TParameters>
44 {
45 /// <summary>
46 /// Фильтрация для БД.
47 /// Может использовать специфичные для БД функции.
48 /// </summary>
49 /// <param name="source"></param>
50 /// <returns></returns>
51 IQueryable<TData> ApplayQueryable(IQueryable<TData> source, TParameters parameters);
52 }{{/code}}|{{code language="c#"}}public class DelegateIQueryableCondition<TData, TParameters>
53 : IQueryableCondition<TData, TParameters>
54 {
55 private readonly Func<IQueryable<TData>, TParameters, IQueryable<TData>> _applayQueryableFunc;
56
57 public DelegateIQueryableCondition(Func<IQueryable<TData>, TParameters, IQueryable<TData>> applayQueryableFunc)
58 {
59 _applayQueryableFunc = applayQueryableFunc;
60 }
61
62 public IQueryable<TData> ApplayQueryable(IQueryable<TData> source, TParameters parameters)
63 {
64 return _applayQueryableFunc(source, parameters);
65 }
66 }{{/code}}
Alexandr Fokin 1.2 67 |(% style="width:88px" %)Контейнер для агрегата.|(% style="width:1104px" %){{code language="c#"}} public interface TEntityConditions
Alexandr Fokin 1.1 68 {
69 public (
70 IInMemoryCondition<TEntity, long> Memory,
71 IQueryableCondition<TEntity, long> Query
72 ) ById { get; }
73
74 public (
75 IInMemoryCondition<TEntity, string> Memory,
76 IQueryableCondition<TEntity, string> Query
77 ) ByName { get; }
78
79 public (
80 IInMemoryCondition<TEntity, object?> Memory,
81 IQueryableCondition<TEntity, object?> Query
82 ) IsRule1 { get; }
83 }{{/code}}|
84
85
86 )))
87 |(% style="width:186px" %)Вспомогательный Extension|(% style="width:1247px" %)(((
88 |{{code language="c#"}}public static class IConditionExtension
89 {
90 public static IQueryable<TEntity> ApplayFilterCondition<TEntity, TParameter>(
91 this IQueryable<TEntity> source,
92 IQueryableCondition<TEntity, TParameter> condition,
93 TParameter parameter)
94 {
95 return condition.ApplayQueryable(
96 source,
97 parameter);
98 }
99
100 public static IEnumerable<TEntity> ApplayFilterCondition<TEntity, TParameter>(
101 this IEnumerable<TEntity> source,
102 IInMemoryCondition<TEntity, TParameter> condition,
103 TParameter parameter)
104 {
105 return condition.ApplayEnumerable(
106 source,
107 parameter);
108 }
109 }{{/code}}|
110 | |
111 | |
112
113
114 )))
115
116