-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathSimpleInjectorExtensions.cs
More file actions
144 lines (130 loc) · 6.96 KB
/
SimpleInjectorExtensions.cs
File metadata and controls
144 lines (130 loc) · 6.96 KB
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using SimpleInjector;
using ViennaNET.Mediator.Pipelines;
using ViennaNET.Mediator.Seedwork;
namespace ViennaNET.Mediator.DefaultConfiguration
{
public static class SimpleInjectorExtensions
{
/// <summary>
/// Регистрирует обработчик для синхронного взаимодействия
/// </summary>
/// <typeparam name="TMessage">Тип сообщения</typeparam>
/// <typeparam name="TResponse">Тип результата</typeparam>
/// <typeparam name="THandler">Тип обработчика</typeparam>
/// <param name="container">DI-контейнер SimpleInjector-а</param>
/// <returns></returns>
public static Container RegisterHandler<TMessage, TResponse, THandler>(this Container container)
where TMessage : class, IMessage
where THandler : class, IMessageHandler<TMessage, TResponse>
{
container.Collection.Append<IMessageHandler, THandler>(Lifestyle.Singleton);
container.Collection.Append<IMessageHandler<TMessage, TResponse>, THandler>(Lifestyle.Singleton);
return container;
}
/// <summary>
/// Регистрирует обработчик для синхронного взаимодействия
/// </summary>
/// <typeparam name="TMessage">Тип сообщения</typeparam>
/// <typeparam name="THandler">Тип обработчика</typeparam>
/// <param name="container">DI-контейнер SimpleInjector-а</param>
/// <returns></returns>
public static Container RegisterHandler<TMessage, THandler>(this Container container)
where TMessage : class, IMessage
where THandler : class, IMessageHandler<TMessage>
{
container.Collection.Append<IMessageHandler, THandler>(Lifestyle.Singleton);
container.Collection.Append<IMessageHandler<TMessage>, THandler>(Lifestyle.Singleton);
return container;
}
/// <summary>
/// Регистрирует обработчик для асинхронного взаимодействия
/// </summary>
/// <typeparam name="TMessage">Тип сообщения</typeparam>
/// <typeparam name="TResponse">Тип результата</typeparam>
/// <typeparam name="THandler">Тип обработчика</typeparam>
/// <param name="container">DI-контейнер SimpleInjector-а</param>
/// <returns></returns>
public static Container RegisterAsyncHandler<TMessage, TResponse, THandler>(this Container container)
where TMessage : class, IMessage
where THandler : class, IMessageHandlerAsync<TMessage, TResponse>
{
container.Collection.Append<IMessageHandlerAsync, THandler>(Lifestyle.Singleton);
container.Collection.Append<IMessageHandlerAsync<TMessage, TResponse>, THandler>(Lifestyle.Singleton);
return container;
}
/// <summary>
/// Регистрирует обработчик для асинхронного взаимодействия
/// </summary>
/// <typeparam name="TMessage">Тип сообщения</typeparam>
/// <typeparam name="THandler">Тип обработчика</typeparam>
/// <param name="container">DI-контейнер SimpleInjector-а</param>
/// <returns></returns>
public static Container RegisterAsyncHandler<TMessage, THandler>(this Container container)
where TMessage : class, IMessage
where THandler : class, IMessageHandlerAsync<TMessage>
{
container.Collection.Append<IMessageHandlerAsync, THandler>(Lifestyle.Singleton);
container.Collection.Append<IMessageHandlerAsync<TMessage>, THandler>(Lifestyle.Singleton);
return container;
}
/// <summary>
/// Регистрирует обработчик как для синхронного, так и для асинхронного взаимодействия
/// </summary>
/// <typeparam name="TMessage">Тип сообщения</typeparam>
/// <typeparam name="TResponse">Тип результата</typeparam>
/// <typeparam name="THandler">Тип обработчика</typeparam>
/// <param name="container">DI-контейнер SimpleInjector-а</param>
/// <returns></returns>
public static Container RegisterFullHandler<TMessage, TResponse, THandler>(this Container container)
where TMessage : class, IMessage
where THandler : class, IMessageHandler<TMessage, TResponse>, IMessageHandlerAsync<TMessage, TResponse>
{
container.RegisterHandler<TMessage, TResponse, THandler>();
container.RegisterAsyncHandler<TMessage, TResponse, THandler>();
return container;
}
/// <summary>
/// Регистрирует обработчик как для синхронного, так и для асинхронного взаимодействия
/// </summary>
/// <typeparam name="TMessage">Тип сообщения</typeparam>
/// <typeparam name="THandler">Тип обработчика</typeparam>
/// <param name="container">DI-контейнер SimpleInjector-а</param>
/// <returns></returns>
public static Container RegisterFullHandler<TMessage, THandler>(this Container container)
where TMessage : class, IMessage
where THandler : class, IMessageHandler<TMessage>, IMessageHandlerAsync<TMessage>
{
container.RegisterHandler<TMessage, THandler>();
container.RegisterAsyncHandler<TMessage, THandler>();
return container;
}
/// <summary>
/// Registers for message pre-processor.
/// </summary>
/// <typeparam name="TMessage">The type of message <see cref="IMessage" />.</typeparam>
/// <typeparam name="TMessagePreProcessor">The type of pre-processor.</typeparam>
/// <param name="order">Order of pre-processor for ordered execution.</param>
/// <param name="container">The container.</param>
public static void RegisterMessagePreProcessor<TMessage, TMessagePreProcessor>(this Container container,
int order = 0)
where TMessage : class, IMessage where TMessagePreProcessor : IMessagePreProcessor<TMessage>
{
container.Register(typeof(TMessagePreProcessor));
container.Register(() => new PreProcessorOrder<TMessagePreProcessor> { Order = order });
container.Register<PipelineMessagePreProcessorRegistrar<TMessage, TMessagePreProcessor>>();
}
/// <summary>
/// Registers broadcast pre-processor.
/// </summary>
/// <typeparam name="TMessagePreProcessor">The type of pre-processor.</typeparam>
/// <param name="container">The container.</param>
/// <param name="order">Order of pre-processor for ordered execution.</param>
public static void RegisterBroadcastPreProcessor<TMessagePreProcessor>(this Container container, int order = 0)
where TMessagePreProcessor : IBroadcastPreProcessor
{
container.Register(typeof(TMessagePreProcessor));
container.Register(() => new PreProcessorOrder<TMessagePreProcessor> { Order = order });
container.Register<PipelineBroadcastPreProcessorRegistrar<TMessagePreProcessor>>();
}
}
}