-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathContainerExtensions.cs
More file actions
159 lines (144 loc) · 6.16 KB
/
ContainerExtensions.cs
File metadata and controls
159 lines (144 loc) · 6.16 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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SimpleInjector;
using ViennaNET.Messaging.Exceptions;
using ViennaNET.Messaging.Listening;
using ViennaNET.Messaging.Processing;
using ViennaNET.Messaging.Tools;
namespace ViennaNET.Messaging.DefaultConfiguration
{
/// <summary>
/// Методы расширения для контейнера
/// </summary>
[ExcludeFromCodeCoverage]
public static class ContainerExtensions
{
/// <summary>
/// Регистрирует дефолтный Json-сериализатор для заданного класса
/// </summary>
public static Container AppendSerializerJson<T>(this Container container)
{
container.Collection.Append<IMessageSerializer, JsonMessageSerializer<T>>(Lifestyle.Singleton);
return container;
}
/// <summary>
/// Регистрирует дефолтный Json-десериализатор для заданного класса
/// </summary>
public static Container AppendDeserializerJson<T>(this Container container)
{
container.Collection.Append<IMessageDeserializer, JsonMessageSerializer<T>>(Lifestyle.Singleton);
return container;
}
/// <summary>
/// Регистрирует дефолтный Xml-сериализатор для заданного класса
/// </summary>
public static Container AppendSerializerXml<T>(this Container container)
{
container.Collection.Append<IMessageSerializer, XmlMessageSerializer<T>>(Lifestyle.Singleton);
return container;
}
/// <summary>
/// Регистрирует дефолтный Xml-десериализатор для заданного класса
/// </summary>
public static Container AppendDeserializerXml<T>(this Container container)
{
container.Collection.Append<IMessageDeserializer, XmlMessageSerializer<T>>(Lifestyle.Singleton);
return container;
}
/// <summary>
/// Регистрирует все обработчики сообщений из указанных сборок
/// </summary>
public static void RegisterAllQueueProcessors(this Container container, Lifestyle lifestyle,
params Assembly[] assemblies)
{
RegisterCollection(container, typeof(IProcessor), lifestyle, assemblies);
RegisterCollection(container, typeof(IProcessorAsync), lifestyle, assemblies);
}
/// <summary>
/// Регистрирует все обработчики сообщений из указанных сборок
/// </summary>
public static void RegisterAllQueueProcessors(this Container container, Lifestyle lifestyle,
IEnumerable<Assembly> assemblies)
{
var list = assemblies.ToList();
RegisterCollection(container, typeof(IProcessor), lifestyle, list);
RegisterCollection(container, typeof(IProcessorAsync), lifestyle, list);
}
private static void RegisterCollection(Container container, Type interfaceType, Lifestyle lifestyle,
IEnumerable<Assembly> assemblies)
{
var typesToRegister = container.GetTypesToRegister(interfaceType, assemblies);
foreach (var type in typesToRegister)
{
var registration = CreateRegistration(container, lifestyle, type);
container.Collection.Append(interfaceType, registration);
}
}
/// <summary>
/// Регистрирует синхронный приемник сообщений
/// </summary>
/// <typeparam name="TType">Тип обработчика сообщений</typeparam>
/// <param name="container"></param>
/// <param name="queueName">Имя очереди</param>
public static void RegisterMessageProcessor<TType>(this Container container,
string queueName)
where TType : class, IProcessor
{
var registration = CreateRegistration(container, Lifestyle.Singleton, typeof(TType));
container.Collection.Append(typeof(IProcessor), registration);
RegisterQueueListener<TType>(container, queueName, Lifestyle.Singleton);
}
/// <summary>
/// Регистрирует асинхронный приемник сообщений
/// </summary>
/// <typeparam name="TType">Тип обработчика сообщений</typeparam>
/// <param name="container"></param>
/// <param name="queueName">Имя очереди</param>
public static void RegisterAsyncMessageProcessor<TType>(this Container container,
string queueName)
where TType : class, IProcessorAsync
{
var registration = CreateRegistration(container, Lifestyle.Singleton, typeof(TType));
container.Collection.Append(typeof(IProcessorAsync), registration);
RegisterQueueListener<TType>(container, queueName, Lifestyle.Singleton);
}
private static void RegisterQueueListener<TType>(Container container,
string queueName,
Lifestyle currentLifestyle)
where TType : class
{
container.Collection.Append<IQueueListener>(() => new QueueListener<TType>(
(IQueueReactorFactory)container.GetRequiredService(typeof(IQueueReactorFactory)),
(ILogger<QueueListener<TType>>)container.GetRequiredService(typeof(ILogger<QueueListener<TType>>)),
queueName),
currentLifestyle);
}
private static Registration CreateRegistration(Container container, Lifestyle lifestyle, Type type)
{
Registration registration;
if (lifestyle == Lifestyle.Singleton)
{
registration = Lifestyle.Singleton.CreateRegistration(type, container);
}
else if (lifestyle == Lifestyle.Transient)
{
registration = Lifestyle.Transient.CreateRegistration(type, container);
}
else if (lifestyle == Lifestyle.Scoped)
{
registration = Lifestyle.Scoped.CreateRegistration(type, container);
}
else
{
throw new MessagingConfigurationException(
$"Unsupported lifestyle {lifestyle} in RegisterAllQueueProcessors. Check your Package registrations.");
}
return registration;
}
}
}