-
Notifications
You must be signed in to change notification settings - Fork 37
/
ApplicationContext.cs
129 lines (113 loc) · 5.78 KB
/
ApplicationContext.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using ViennaNET.Orm.Application;
using ViennaNET.Orm.Repositories;
using ViennaNET.Orm.Seedwork;
namespace ViennaNET.Orm
{
/// <summary>
/// Позволяет регистрировать элементы ограниченного контекста приложения.
/// Для использование необходимо создать единственного наследника данного класса
/// внутри пользовательского приложения и зарегистрировать его в DI
/// </summary>
public abstract class ApplicationContext : BoundedContext, IApplicationContext
{
private readonly List<(Type, string)> _commands = new();
private readonly List<(Type, string)> _customQueries = new();
private readonly List<(Type, string, Assembly)> _integrationEvents = new();
private readonly List<(string, string)> _namedQueries = new();
/// <inheritdoc />
public IReadOnlyCollection<(string, string)> NamedQueries => _namedQueries.AsReadOnly();
/// <inheritdoc />
public IReadOnlyCollection<(Type, string)> Commands => _commands.AsReadOnly();
/// <inheritdoc />
public IReadOnlyCollection<(Type, string)> CustomQueries => _customQueries.AsReadOnly();
/// <inheritdoc />
public IReadOnlyCollection<(Type, string, Assembly)> IntegrationEvents => _integrationEvents.AsReadOnly();
/// <summary>
/// Позволяет добавить новую команду в контекст
/// </summary>
/// <typeparam name="T">Тип регистрируемой команды</typeparam>
/// <param name="dbNick">Имя подключения к БД в файле конфигурации</param>
protected IApplicationContext AddCommand<T>(string dbNick = null) where T : class, ICommand
{
_commands.Add((typeof(T), dbNick));
return this;
}
/// <summary>
/// Регистрирует все команды в сборке
/// </summary>
/// <param name="dbNick">Имя подключения к БД в файле конфигурации</param>
/// <param name="assembly">
/// Сборка в которой ведётся поиск команд. По умолчанию - <see cref="Assembly.GetCallingAssembly" />
/// .
/// </param>
/// <returns>Себя</returns>
/// <remarks>Поиск команд ведётся по реализации от <see cref="ICommand" /></remarks>
protected IApplicationContext AddAllCommands(string dbNick = null, Assembly assembly = null)
{
var myAssembly = assembly ?? Assembly.GetCallingAssembly();
var commands = myAssembly
.GetTypes()
.Where(t => t.IsClass && !t.IsAbstract && t.GetInterfaces().Contains(typeof(ICommand)))
.Select(t => (t, dbNick));
_commands.AddRange(commands);
return this;
}
/// <summary>
/// Позволяет добавить новый именованный запрос в контекст
/// </summary>
/// <param name="queryName">Имя регистрируемого запроса</param>
/// <param name="dbNick">Имя подключения к БД в файле конфигурации</param>
protected IApplicationContext AddNamedQuery(string queryName, string dbNick = null)
{
_namedQueries.Add((queryName, dbNick));
return this;
}
/// <summary>
/// Позволяет добавить новый настраиваемый запрос в контекст
/// </summary>
/// <typeparam name="T">Тип сущности, возвращаемой запросом</typeparam>
/// <param name="dbNick">Имя подключения к БД в файле конфигурации</param>
protected IApplicationContext AddCustomQuery<T>(string dbNick = null) where T : class
{
_customQueries.Add((typeof(T), dbNick));
return this;
}
/// <summary>
/// Позволяет добавить новое событие для публикации в контекст
/// </summary>
/// <typeparam name="T">Тип регистрируемого события</typeparam>
/// <param name="dbNick">Имя подключения к БД в файле конфигурации</param>
/// <param name="assembly">Сборка в которой находится класс события</param>
/// <returns></returns>
protected IApplicationContext AddIntegrationEvent<T>(string dbNick = null, Assembly assembly = null)
where T : class, IIntegrationEvent
{
_integrationEvents.Add((typeof(T), dbNick, assembly));
return this;
}
/// <summary>
/// Регистрирует все события в сборке
/// </summary>
/// <param name="dbNick">Имя подключения к БД в файле конфигурации</param>
/// <param name="assembly">
/// Сборка в которой ведётся поиск событий. По умолчанию -
/// <see cref="Assembly.GetCallingAssembly" />.
/// </param>
/// <returns>Себя</returns>
/// <remarks>Поиск событий ведётся по реализации классом интерфейса <see cref="IIntegrationEvent" /></remarks>
protected IApplicationContext AddAllIntegrationEvents(string dbNick = null, Assembly assembly = null)
{
var myAssembly = assembly ?? Assembly.GetCallingAssembly();
var events = myAssembly
.GetTypes()
.Where(t => t.IsClass && !t.IsAbstract && t.GetInterfaces().Contains(typeof(IIntegrationEvent)))
.Select(t => (t, dbNick, assembly));
_integrationEvents.AddRange(events);
return this;
}
}
}