pull/1/head
Ogoun 6 years ago
parent d30d681f0c
commit 0f47f1cc13

@ -1,7 +1,6 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Net;
using System.Reflection;
using ZeroLevel.Network.Microservices;
using ZeroLevel.Services.Network;
@ -16,8 +15,7 @@ namespace ZeroLevel.Microservices
private static readonly ConcurrentDictionary<string, ExClient> _clientInstances = new ConcurrentDictionary<string, ExClient>();
/// <summary>
/// Сканирование указанной сборки для поиска типов реализующих интерфейсы
/// IExchangeServer или IExchangeClient
/// Scanning the specified assembly to find the types that implement the IExchangeServer or IExchangeClient interfaces
/// </summary>
internal static void ScanAndRegisterCustomTransport(Assembly asm)
{
@ -41,16 +39,16 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Создает сервер для приема сообщений по указанному протоколу
/// Creates a server to receive messages using the specified protocol
/// </summary>
/// <param name="protocol">Протокол</param>
/// <returns>Сервер</returns>
/// <param name="protocol">Protocol</param>
/// <returns>Server</returns>
internal static ExService GetServer(string protocol)
{
ExService instance = null;
if (protocol.Equals("socket", StringComparison.OrdinalIgnoreCase))
{
instance = new ExService(new ZExSocketObservableServer(new System.Net.IPEndPoint(IPAddress.Any, IPFinder.GetFreeTcpPort())));
instance = new ExService(new ZExSocketObservableServer(new System.Net.IPEndPoint(IPFinder.GetNonLoopbackAddress(), IPFinder.GetFreeTcpPort())));
}
else
{
@ -68,11 +66,11 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Создает клиента для обращений к серверу по указанному протоколу
/// Creates a client to access the server using the specified protocol
/// </summary>
/// <param name="protocol">Протокол</param>
/// <param name="endpoint">Адрес сервера</param>
/// <returns>Клиент</returns>
/// <param name="protocol">Protocol</param>
/// <param name="endpoint">Server endpoint</param>
/// <returns>Client</returns>
internal static ExClient GetClient(string protocol, string endpoint)
{
ExClient instance = null;
@ -85,6 +83,7 @@ namespace ZeroLevel.Microservices
return instance;
}
_clientInstances.TryRemove(cachee_key, out instance);
instance.Dispose();
instance = null;
}
if (protocol.Equals("socket", StringComparison.OrdinalIgnoreCase))

@ -1 +1 @@
02ab5562f7a9f633d41e073aff759527ff59696c
4f0bbfe8ac44b56784f7eeaa3cdef96609d6b97e

@ -115,11 +115,7 @@ namespace ZeroLevel.ProxyREST
}
catch (Exception ex)
{
var line = string.Format("Сбой запроса ресурса {0} методом {1}. Код ошибки: {2}. Комментарий: {3}",
resource,
method,
statusCode ?? "Uncknown",
reason ?? ex.Message);
var line = $"Resource request failed. [{method}] {resource}. Error code: {(statusCode ?? "Uncknown")}. Comment: {(reason ?? ex.Message)}";
Log.Error(ex, line);
throw new InvalidOperationException(line, ex);
}

@ -253,12 +253,12 @@ namespace ZeroLevel.Microservices
#region Inboxes
/// <summary>
/// Регистрация обработчика входящих сообщений
/// Registering an Inbox Handler
/// </summary>
/// <typeparam name="T">Тип сообщения</typeparam>
/// <param name="protocol">Транспортный протокол</param>
/// <param name="inbox">Имя точки приема</param>
/// <param name="handler">Обработчик</param>
/// <typeparam name="T">Message type</typeparam>
/// <param name="protocol">Protocol</param>
/// <param name="inbox">Inbox name</param>
/// <param name="handler">Handler</param>
private void RegisterHandler<T>(MetaService meta, string inbox, Action<T, long, IZBackward> handler)
{
if (_disposed) return;
@ -273,13 +273,13 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Регистрация метода отдающего ответ на входящий запрос
/// Registration method responding to an incoming request
/// </summary>
/// <typeparam name="Treq">Тип входного сообщения</typeparam>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="protocol">Транспортный протокол</param>
/// <param name="inbox">Имя точки приема</param>
/// <param name="replier">Обработчик</param>
/// <typeparam name="Treq">Request message type</typeparam>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="protocol">Protocol</param>
/// <param name="inbox">Inbox name</param>
/// <param name="replier">Handler</param>
private void RegisterReplier<Treq, Tresp>(MetaService meta, string inbox, Func<Treq, long, IZBackward, Tresp> handler)
{
if (_disposed) return;
@ -294,12 +294,12 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Регистрация метода отдающего ответ на входящий запрос, не принимающего входящих данных
/// Registration of the method of responding to the incoming request, not receiving incoming data
/// </summary>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="protocol">Транспортный протокол</param>
/// <param name="inbox">Имя точки приема</param>
/// <param name="replier">Обработчик</param>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="protocol">Protocol</param>
/// <param name="inbox">Inbox name</param>
/// <param name="replier">Handler</param>
private void RegisterReplierWithNoRequestBody<Tresp>(MetaService meta, string inbox, Func<long, IZBackward, Tresp> handler)
{
if (_disposed) return;

@ -10,7 +10,7 @@ using ZeroLevel.Services.Network;
namespace ZeroLevel.Microservices
{
/// <summary>
/// Обеспечивает обмен данными между сервисами
/// Provides data exchange between services
/// </summary>
public sealed class Exchange :
IDisposable
@ -29,7 +29,7 @@ namespace ZeroLevel.Microservices
#endregion Ctor
/// <summary>
/// Регистрация сервиса
/// Registration service
/// </summary>
public IExService RegisterService(IExchangeService service)
{
@ -44,11 +44,11 @@ namespace ZeroLevel.Microservices
#region Balanced send
/// <summary>
/// Отправка сообщения сервису
/// Sending a message to the service
/// </summary>
/// <param name="serviceKey">Ключ сервиса</param>
/// <param name="inbox">Имя точки приема сообщений</param>
/// <param name="data">Сообщение</param>
/// <param name="serviceKey">Service key</param>
/// <param name="inbox">Inbox name</param>
/// <param name="data">Message</param>
/// <returns></returns>
public bool Send<T>(string serviceKey, string inbox, T data)
{
@ -262,13 +262,13 @@ namespace ZeroLevel.Microservices
#region Broadcast
/// <summary>
/// Отправка сообщения всем сервисам с указанным ключом в указанный обработчик
/// Sending a message to all services with the specified key to the specified handler
/// </summary>
/// <typeparam name="T">Тип сообщения</typeparam>
/// <param name="serviceKey">Ключ сервиса</param>
/// <param name="inbox">Имя обработчика</param>
/// <param name="data">Сообщение</param>
/// <returns>true - при успешной отправке</returns>
/// <typeparam name="T">Message type</typeparam>
/// <param name="serviceKey">Service key</param>
/// <param name="inbox">Inbox name</param>
/// <param name="data">Message</param>
/// <returns>true - on successful submission</returns>
public bool SendBroadcast<T>(string serviceKey, string inbox, T data)
{
try
@ -296,22 +296,22 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Отправка сообщения всем сервисам с указанным ключом, в обработчик по умолчанию
/// Sending a message to all services with the specified key, to the default handler
/// </summary>
/// <typeparam name="T">Тип сообщения</typeparam>
/// <param name="serviceKey">Ключ сервиса</param>
/// <param name="data">Сообщение</param>
/// <returns>true - при успешной отправке</returns>
/// <typeparam name="T">Message type</typeparam>
/// <param name="serviceKey">Service key</param>
/// <param name="data">Message</param>
/// <returns>true - on successful submission</returns>
public bool SendBroadcast<T>(string serviceKey, T data) => SendBroadcast(serviceKey, ZBaseNetwork.DEFAULT_MESSAGE_INBOX, data);
/// <summary>
/// Отправка сообщения всем сервисам конкретного типа в указанный обработчик
/// Sending a message to all services of a specific type to the specified handler
/// </summary>
/// <typeparam name="T">Тип сообщения</typeparam>
/// <param name="serviceType">Тип сервиса</param>
/// <param name="inbox">Имя обработчика</param>
/// <param name="data">Сообщение</param>
/// <returns>true - при успешной отправке</returns>
/// <typeparam name="T">Message type</typeparam>
/// <param name="serviceType">Service type</param>
/// <param name="inbox">Inbox name</param>
/// <param name="data">Message</param>
/// <returns>true - on successful submission</returns>
public bool SendBroadcastByType<T>(string serviceType, string inbox, T data)
{
try
@ -339,23 +339,23 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Отправка сообщения всем сервисам конкретного типа, в обработчик по умолчанию
/// Sending a message to all services of a particular type, to the default handler
/// </summary>
/// <typeparam name="T">Тип сообщения</typeparam>
/// <param name="serviceType">Тип сервиса</param>
/// <param name="data">Сообщение</param>
/// <returns>true - при успешной отправке</returns>
/// <typeparam name="T">Message type</typeparam>
/// <param name="serviceType">Service type</param>
/// <param name="data">Message</param>
/// <returns>true - on successful submission</returns>
public bool SendBroadcastByType<T>(string serviceType, T data) =>
SendBroadcastByType(serviceType, ZBaseNetwork.DEFAULT_MESSAGE_INBOX, data);
/// <summary>
/// Отправка сообщения всем сервисам конкретной группы в указанный обработчик
/// Sending a message to all services of a specific group to the specified handler
/// </summary>
/// <typeparam name="T">Тип сообщения</typeparam>
/// <param name="serviceGroup">Группа сервиса</param>
/// <param name="inbox">Имя обработчика</param>
/// <param name="data">Сообщение</param>
/// <returns>true - при успешной отправке</returns>
/// <typeparam name="T">Message type</typeparam>
/// <param name="serviceGroup">Service group</param>
/// <param name="inbox">Inbox name</param>
/// <param name="data">Message</param>
/// <returns>true - on successful submission</returns>
public bool SendBroadcastByGroup<T>(string serviceGroup, string inbox, T data)
{
try
@ -383,25 +383,25 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Отправка сообщения всем сервисам конкретной группы, в обработчик по умолчанию
/// Sending a message to all services of a specific group in the default handler
/// </summary>
/// <typeparam name="T">Тип сообщения</typeparam>
/// <param name="serviceGroup">Группа сервиса</param>
/// <param name="data">Сообщение</param>
/// <returns>true - при успешной отправке</returns>
/// <typeparam name="T">Message type</typeparam>
/// <param name="serviceGroup">Service group</param>
/// <param name="data">Messsage</param>
/// <returns>true - on successful submission</returns>
public bool SendBroadcastByGroup<T>(string serviceGroup, T data) =>
SendBroadcastByGroup(serviceGroup, ZBaseNetwork.DEFAULT_MESSAGE_INBOX, data);
/// <summary>
/// Широковещательный опрос сервисов по ключу
/// Broadcast polling services by key
/// </summary>
/// <typeparam name="Treq">Тип запроса</typeparam>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceKey">Ключ сервиса</param>
/// <param name="inbox">Имя обработчика</param>
/// <param name="data">Запрос</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Treq">Request message type</typeparam>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceKey">Service key</param>
/// <param name="inbox">Inbox name</param>
/// <param name="data">Request message</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcast<Treq, Tresp>(string serviceKey, string inbox, Treq data)
{
try
@ -417,13 +417,13 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Широковещательный опрос сервисов по ключу, без сообщеня запроса
/// Broadcast polling services by key, without message request
/// </summary>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceKey">Ключ сервиса</param>
/// <param name="inbox">Имя обработчика</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceKey">Service key</param>
/// <param name="inbox">Inbox name</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcast<Tresp>(string serviceKey, string inbox)
{
try
@ -439,37 +439,37 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Широковещательный опрос сервисов по ключу, в обработчик по умолчанию
/// Broadcast polling services by key, to default handler
/// </summary>
/// <typeparam name="Treq">Тип запроса</typeparam>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceKey">Ключ сервиса</param>
/// <param name="data">Запрос</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Treq">Request message type</typeparam>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceKey">Service key</param>
/// <param name="data">Request message</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcast<Treq, Tresp>(string serviceKey, Treq data) =>
RequestBroadcast<Treq, Tresp>(serviceKey, ZBaseNetwork.DEFAULT_REQUEST_INBOX, data);
/// <summary>
/// Широковещательный опрос сервисов по ключу, без сообщеня запроса, в обработчик по умолчанию
/// Broadcast polling of services by key, without message of request, to default handler
/// </summary>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceKey">Ключ сервиса</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceKey">Service key</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcast<Tresp>(string serviceKey) =>
RequestBroadcast<Tresp>(serviceKey, ZBaseNetwork.DEFAULT_REQUEST_INBOX);
/// <summary>
/// Широковещательный опрос сервисов по типу сервису
/// Broadcast polling services by type of service
/// </summary>
/// <typeparam name="Treq">Тип запроса</typeparam>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceType">Тип сервиса</param>
/// <param name="inbox">Имя обработчика</param>
/// <param name="data">Запрос</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Treq">Request message type</typeparam>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceType">Service type</param>
/// <param name="inbox">Inbox name</param>
/// <param name="data">Request message</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcastByType<Treq, Tresp>(string serviceType, string inbox, Treq data)
{
try
@ -485,13 +485,13 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Широковещательный опрос сервисов по типу сервису, без сообщеня запроса
/// Broadcast polling of services by type of service, without a request message
/// </summary>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceType">Тип сервиса</param>
/// <param name="inbox">Имя обработчика</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceType">Service type</param>
/// <param name="inbox">Inbox name</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcastByType<Tresp>(string serviceType, string inbox)
{
try
@ -507,37 +507,37 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Широковещательный опрос сервисов по типу сервису, в обработчик по умолчанию
/// Broadcast polling services by type of service, in the default handler
/// </summary>
/// <typeparam name="Treq">Тип запроса</typeparam>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceType">Тип сервиса</param>
/// <param name="data">Запрос</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Treq">Request message type</typeparam>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceType">Service type</param>
/// <param name="data">Request message</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcastByType<Treq, Tresp>(string serviceType, Treq data) =>
RequestBroadcastByType<Treq, Tresp>(serviceType, ZBaseNetwork.DEFAULT_REQUEST_INBOX, data);
/// <summary>
/// Широковещательный опрос сервисов по типу, без сообщеня запроса, в обработчик по умолчанию
/// Broadcast polling services by type, without message request, in the default handler
/// </summary>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceType">Тип сервиса</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceType">Service type</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcastByType<Tresp>(string serviceType) =>
RequestBroadcastByType<Tresp>(serviceType, ZBaseNetwork.DEFAULT_REQUEST_INBOX);
/// <summary>
/// Широковещательный опрос сервисов по группе сервисов
/// Broadcast polling services for a group of services
/// </summary>
/// <typeparam name="Treq">Тип запроса</typeparam>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceGroup">Группа сервиса</param>
/// <param name="inbox">Имя обработчика</param>
/// <param name="data">Запрос</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Treq">Request message type</typeparam>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceGroup">Service group</param>
/// <param name="inbox">Inbox name</param>
/// <param name="data">Request message</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcastByGroup<Treq, Tresp>(string serviceGroup, string inbox, Treq data)
{
try
@ -553,13 +553,13 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Широковещательный опрос сервисов по группе сервисов, без сообщения запроса
/// Broadcast polling services for a group of services, without prompting
/// </summary>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceGroup">Группа сервиса</param>
/// <param name="inbox">Имя обработчика</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceGroup">Service group</param>
/// <param name="inbox">Inbox name</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcastByGroup<Tresp>(string serviceGroup, string inbox)
{
try
@ -575,24 +575,24 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Широковещательный опрос сервисов по группе сервисов в обработчик по умолчанию
/// Broadcast polling services by service group to default handler
/// </summary>
/// <typeparam name="Treq">Тип запроса</typeparam>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceGroup">Группа сервиса</param>
/// <param name="data">Запрос</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Treq">Request message type</typeparam>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceGroup">Service group</param>
/// <param name="data">Request message</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcastByGroup<Treq, Tresp>(string serviceGroup, Treq data) =>
RequestBroadcastByGroup<Treq, Tresp>(serviceGroup, ZBaseNetwork.DEFAULT_REQUEST_INBOX, data);
/// <summary>
/// Широковещательный опрос сервисов по группе сервисов, без сообщения запроса, в обработчик по умолчанию
///Broadcast polling services for a group of services, without sending a request, to the default handler
/// </summary>
/// <typeparam name="Tresp">Тип ответа</typeparam>
/// <param name="serviceGroup">Группа сервиса</param>
/// <param name="responseHandler">Обработчик ответа</param>
/// <returns>true - в случае успешной рассылки</returns>
/// <typeparam name="Tresp">Response message type</typeparam>
/// <param name="serviceGroup">Service group</param>
/// <param name="responseHandler">Response handler</param>
/// <returns>true - in case of successful mailing</returns>
public IEnumerable<Tresp> RequestBroadcastByGroup<Tresp>(string serviceGroup) =>
RequestBroadcastByGroup<Tresp>(serviceGroup, ZBaseNetwork.DEFAULT_REQUEST_INBOX);

@ -15,8 +15,7 @@ namespace ZeroLevel.Microservices
private static readonly ConcurrentDictionary<string, ExClient> _clientInstances = new ConcurrentDictionary<string, ExClient>();
/// <summary>
/// Сканирование указанной сборки для поиска типов реализующих интерфейсы
/// IExchangeServer или IExchangeClient
/// Scanning the specified assembly to find the types that implement the IExchangeServer or IExchangeClient interfaces
/// </summary>
internal static void ScanAndRegisterCustomTransport(Assembly asm)
{
@ -40,10 +39,10 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Создает сервер для приема сообщений по указанному протоколу
/// Creates a server to receive messages using the specified protocol
/// </summary>
/// <param name="protocol">Протокол</param>
/// <returns>Сервер</returns>
/// <param name="protocol">Protocol</param>
/// <returns>Server</returns>
internal static ExService GetServer(string protocol)
{
ExService instance = null;
@ -67,11 +66,11 @@ namespace ZeroLevel.Microservices
}
/// <summary>
/// Создает клиента для обращений к серверу по указанному протоколу
/// Creates a client to access the server using the specified protocol
/// </summary>
/// <param name="protocol">Протокол</param>
/// <param name="endpoint">Адрес сервера</param>
/// <returns>Клиент</returns>
/// <param name="protocol">Protocol</param>
/// <param name="endpoint">Server endpoint</param>
/// <returns>Client</returns>
internal static ExClient GetClient(string protocol, string endpoint)
{
ExClient instance = null;

@ -28,7 +28,6 @@ namespace ZeroLevel.Microservices
#endregion WebAPI
// Таблица по ключам
private readonly ConcurrentDictionary<string, RoundRobinCollection<ServiceEndpointInfo>> _tableByKey =
new ConcurrentDictionary<string, RoundRobinCollection<ServiceEndpointInfo>>();

@ -1 +1 @@
1a68033c72e3e719a45c8165f48f4effb88b5e68
48781ba1f58e845d50aedda0cbff5881dfe0563f

@ -92,20 +92,20 @@ namespace ZeroLevel.Services.Config
#region Get
/// <summary>
/// Получение списка значение соотвествующих указанному ключу
/// Getting a list of the value corresponding to the specified key
/// </summary>
/// <param name="key">Ключ</param>
/// <returns>Список значений</returns>
/// <param name="key">Key</param>
/// <returns>Values list</returns>
public IEnumerable<string> Items(string key)
{
return this[key];
}
/// <summary>
/// Получение первого значения для указанного ключа
/// Getting the first value for the specified key
/// </summary>
/// <param name="key">Ключ</param>
/// <returns>Первое значение, или null если ключ есть, но нет значений, или KeyNotFoundException если нет ключа</returns>
/// <param name="key">Key</param>
/// <returns>The first value, or null if the key is, but there are no values, or KeyNotFoundException if there is no key</returns>
public string First(string key)
{
IList<string> result;
@ -135,11 +135,11 @@ namespace ZeroLevel.Services.Config
}
/// <summary>
/// Получение первого значения для указанного ключа, с попыткой преобразования в указанный тип
/// Getting the first value for the specified key, with an attempt to convert to the specified type
/// </summary>
/// <typeparam name="T">Ожидаемый тип</typeparam>
/// <param name="key">Ключ</param>
/// <returns>Первое значение, или default(T) если ключ есть, но нет значений, или KeyNotFoundException если нет ключа</returns>
/// <typeparam name="T">Expected type</typeparam>
/// <param name="key">Key</param>
/// <returns>The first value, or default (T) if there is a key but no values, or KeyNotFoundException if there is no key</returns>
public T First<T>(string key)
{
IList<string> result;
@ -153,11 +153,11 @@ namespace ZeroLevel.Services.Config
}
/// <summary>
/// Получение первого значения для указанного ключа, или значения по умолчанию
/// First value, or Default value if no value or key
/// </summary>
/// <param name="key">Ключ</param>
/// <param name="defaultValue">Значение по умолчанию</param>
/// <returns>Первое значение, или значение по умолчанию если нет значений или ключа</returns>
/// <param name="key">Key</param>
/// <param name="defaultValue">Default value</param>
/// <returns>First value, or Default value if no value or key</returns>
public string FirstOrDefault(string key, string defaultValue)
{
IList<string> result;
@ -170,11 +170,11 @@ namespace ZeroLevel.Services.Config
}
/// <summary>
/// Получение первого значения для указанного ключа, или значения по умолчанию, с попыткой преобразования в указанный тип
/// Getting the first value for the specified key, or defaults, with an attempt to convert to the specified type
/// </summary>
/// <typeparam name="T">Ожидаемый тип</typeparam>
/// <param name="key">Ключ</param>
/// <returns>Первое значение, или default(T) если нет значений или ключа</returns>
/// <typeparam name="T">Expected type</typeparam>
/// <param name="key">Key</param>
/// <returns>The first value, or default (T) if there are no values or a key</returns>
public T FirstOrDefault<T>(string key)
{
IList<string> result;
@ -187,12 +187,12 @@ namespace ZeroLevel.Services.Config
}
/// <summary>
/// Получение первого значения для указанного ключа, или значения по умолчанию, с попыткой преобразования в указанный тип
/// Getting the first value for the specified key, or defaults, with an attempt to convert to the specified type
/// </summary>
/// <typeparam name="T">Ожидаемый тип</typeparam>
/// <param name="key">Ключ</param>
/// <param name="defaultValue">Значение по умолчанию</param>
/// <returns>Первое значение, или значение по умолчанию если нет значений или ключа</returns>
/// <typeparam name="T">Expected type</typeparam>
/// <param name="key">Key</param>
/// <param name="defaultValue">Default value</param>
/// <returns>First value, or Default value if no value or key</returns>
public T FirstOrDefault<T>(string key, T defaultValue)
{
IList<string> result;
@ -205,10 +205,10 @@ namespace ZeroLevel.Services.Config
}
/// <summary>
/// Проверка наличия ключа и непустого списка связанных с ним значений
/// Check for the presence of a key and a non-empty list of values associated with it
/// </summary>
/// <param name="key">Ключ</param>
/// <returns>true - если существует ключ и есть хотя бы одно значение</returns>
/// <param name="key">Key</param>
/// <returns>true - if a key exists and there is at least one value</returns>
public bool Contains(string key)
{
key = GetKey(key);
@ -216,7 +216,7 @@ namespace ZeroLevel.Services.Config
}
/// <summary>
/// Проверка наличия одного из ключей
/// Check for one of the keys
/// </summary>
public bool Contains(params string[] keys)
{
@ -226,11 +226,8 @@ namespace ZeroLevel.Services.Config
}
/// <summary>
/// Проверка наличия ключа и связанного с ним значения
/// Check for the presence of a key and its associated value
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool ContainsValue(string key, string value)
{
IList<string> result;
@ -242,10 +239,10 @@ namespace ZeroLevel.Services.Config
}
/// <summary>
/// Количество значений связанных с указанным ключом
/// The number of values associated with the specified key
/// </summary>
/// <param name="key">Ключ</param>
/// <returns>Количество значений</returns>
/// <param name="key">Key</param>
/// <returns>Number of values</returns>
public int Count(string key)
{
key = GetKey(key);

@ -125,48 +125,48 @@ namespace ZeroLevel
#region Read configuration
/// <summary>
/// Создание конфигурации из секции AppSettings файла app.config или web.config
/// Creating a configuration from the AppSettings section of the app.config or web.config file
/// </summary>
/// <returns>Конфигурация</returns>
/// <returns>Configuration</returns>
public static IConfiguration ReadFromApplicationConfig() { return new ApplicationConfigReader().ReadConfiguration(); }
/// <summary>
/// Создание конфигурации из секции AppSettings файла app.config или web.config, дополняется секцией 'ConnectionStrings'
/// Creating a configuration from the AppSettings section of the app.config file or web.config, is supplemented by the 'ConnectionStrings' section
/// </summary>
/// <returns>Конфигурация</returns>
/// <returns>Configuration</returns>
public static IConfigurationSet ReadSetFromApplicationConfig() { return new ApplicationConfigReader().ReadConfigurationSet(); }
/// <summary>
/// Создание конфигурации из секции AppSettings файла app.config или web.config
/// Creating a configuration from the AppSettings section of the app.config or web.config file
/// </summary>
/// <returns>Конфигурация</returns>
/// <returns>Configuration</returns>
public static IConfiguration ReadFromApplicationConfig(string configFilePath) { return new ApplicationConfigReader(configFilePath).ReadConfiguration(); }
/// <summary>
/// Создание конфигурации из секции AppSettings файла app.config или web.config, дополняется секцией 'ConnectionStrings'
/// Creating a configuration from the AppSettings section of the app.config file or web.config, is supplemented by the 'ConnectionStrings' section
/// </summary>
/// <returns>Конфигурация</returns>
/// <returns>Configuration</returns>
public static IConfigurationSet ReadSetFromApplicationConfig(string configFilePath) { return new ApplicationConfigReader(configFilePath).ReadConfigurationSet(); }
/// <summary>
/// Создание конфигурации из ini файла
/// Create configuration from ini file
/// </summary>
/// <param name="path">Путь к ini-файлу</param>
/// <returns>Конфигурация</returns>
/// <param name="path">Path to the ini file</param>
/// <returns>Configuration</returns>
public static IConfiguration ReadFromIniFile(string path) { return new IniFileReader(path).ReadConfiguration(); }
/// <summary>
/// Создание конфигурации из ini файла, с учетом секций
/// Creating a configuration from an ini file, including sections
/// </summary>
/// <param name="path">Путь к ini-файлу</param>
/// <returns>Конфигурация</returns>
/// <param name="path">Path to the ini file</param>
/// <returns>Configuration</returns>
public static IConfigurationSet ReadSetFromIniFile(string path) { return new IniFileReader(path).ReadConfigurationSet(); }
/// <summary>
/// Создание конфигурации из параметров командной строки
/// Creating configuration from command line parameters
/// </summary>
/// <param name="args">Параметры командной строки</param>
/// <returns>Конфигурация</returns>
/// <param name="args">Command line parameters</param>
/// <returns>Configuration</returns>
public static IConfiguration ReadFromCommandLine(string[] args) { return new CommandLineReader(args).ReadConfiguration(); }
public static IConfigurationSet ReadBinary(IBinaryReader reader)
@ -179,17 +179,17 @@ namespace ZeroLevel
#region Write configuration
/// <summary>
/// Запись простой конфигурации в ini-файл
/// Write a simple configuration to the ini file
/// </summary>
/// <param name="configuration">Конфигурация</param>
/// <param name="path">Путь к ini-файлу</param>
/// <param name="configuration">Configuration</param>
/// <param name="path">Path to the ini file</param>
public static void WriteToIniFile(IConfiguration configuration, string path) { new IniFileWriter(path).WriteConfiguration(configuration); }
/// <summary>
/// Запись полной конфигурации в ini-файл
/// Write the complete configuration to the ini-file
/// </summary>
/// <param name="configuration">Конфигурация</param>
/// <param name="path">Путь к ini-файлу</param>
/// <param name="configuration">Configuration</param>
/// <param name="path">Path to the ini file</param>
public static void WriteSetToIniFile(IConfigurationSet configuration, string path) { new IniFileWriter(path).WriteConfigurationSet(configuration); }
#endregion Write configuration

@ -51,8 +51,8 @@ namespace ZeroLevel
/// <summary>
/// Get configuration section by name
/// </summary>
/// <param name="sectionName">Название секции</param>
/// <returns>Секция с данными</returns>
/// <param name="sectionName">Section name</param>
/// <returns>Data section</returns>
IConfiguration GetSection(string sectionName);
/// <summary>
@ -79,7 +79,7 @@ namespace ZeroLevel
/// <summary>
/// Remove a prohibition on changing configurations
/// </summary>
/// <returns>false - если запрет снят</returns>
/// <returns>false - if the prohibition is removed</returns>
bool UnfreezeConfiguration();
/// <summary>

@ -5,7 +5,7 @@ using System.IO;
namespace ZeroLevel.Services.Config.Implementation
{
/// <summary>
/// Чтение конфигурации из ini файла
/// Reading configuration from ini file
/// </summary>
internal sealed class IniFileReader
: IConfigurationReader

@ -7,7 +7,7 @@
TToken
{
/// <summary>
/// Имя элемента
/// Element name
/// </summary>
public string ElementName;

@ -15,7 +15,7 @@ namespace ZeroLevel.Services.Extensions
*/
/// <summary>
/// Каррирование
/// Currying
/// </summary>
public static Func<A, Func<B, R>> Curry<A, B, R>(this Func<A, B, R> f)
{
@ -28,7 +28,7 @@ namespace ZeroLevel.Services.Extensions
*/
/// <summary>
/// Частичное исполнение
/// Partial currying
/// </summary>
public static Func<B, R> Partial<A, B, R>(this Func<A, B, R> f, A a)
{

@ -159,7 +159,7 @@ namespace ZeroLevel.Services.FileSystem
}
/// <summary>
/// Файловый архив
/// File archive
/// </summary>
public sealed class FileArchive :
IDisposable
@ -457,7 +457,7 @@ namespace ZeroLevel.Services.FileSystem
}
/// <summary>
/// Сохранение данных в бинарном виде в архив
/// Saving data in binary form in the archive
/// </summary>
/// <param name="data">Data</param>
/// <param name="name">Archive file name (HH_mm_ss_fff_counter.{ext} by default)</param>

@ -81,12 +81,12 @@ namespace ZeroLevel.Services.Impersonation
}
/// <summary>
/// Вход от имени указанного пользователя с указанием способа авторизации
/// Login on behalf of the specified user with the authorization method
/// </summary>
/// <param name="userName">Имя пользователя</param>
/// <param name="domain">Домен</param>
/// <param name="password">Пароль</param>
/// <param name="logonType">Тип авторизации</param>
/// <param name="userName">Login</param>
/// <param name="domain">Domain</param>
/// <param name="password">Password</param>
/// <param name="logonType">Authorization Type</param>
public void ImpersonateByUser(String userName, String domain, String password, ImpersonationNativeMethods.LogonType logonType)
{
MySafeTokenHandle token;
@ -101,9 +101,9 @@ namespace ZeroLevel.Services.Impersonation
}
/// <summary>
/// Копирование прав указанного процесса
/// Copying the rights of the specified process
/// </summary>
/// <param name="ProcessName">Имя процесса</param>
/// <param name="ProcessName">Process name</param>
public void ImpersonateByProcess(string ProcessName)
{
Process[] myProcesses = Process.GetProcesses();

@ -10,11 +10,11 @@ namespace ZeroLevel.Services.Network
void RegisterInbox<T>(string inbox, Action<T, long, IZBackward> handler);
void RegisterInbox<Treq, Tresp>(string inbox, Func<Treq, long, IZBackward, Tresp> handдer);
void RegisterInbox<Treq, Tresp>(string inbox, Func<Treq, long, IZBackward, Tresp> handler);
/// <summary>
/// Replier without request
/// </summary>
void RegisterInbox<Tresp>(string inbox, Func<long, IZBackward, Tresp> handдer);
void RegisterInbox<Tresp>(string inbox, Func<long, IZBackward, Tresp> handler);
}
}

@ -19,13 +19,13 @@ namespace ZeroLevel.Services.Network.Services
/// </summary>
private static Invoker CreateCompiledExpression(MethodInfo method)
{
var targetArg = Expression.Parameter(typeof(object)); // Цель на которой происходит вызов
var argsArg = Expression.Parameter(typeof(object[])); // Аргументы метода
var targetArg = Expression.Parameter(typeof(object)); // Target
var argsArg = Expression.Parameter(typeof(object[])); // Method's args
var parameters = method.GetParameters();
Expression body = Expression.Call(
method.IsStatic
? null
: Expression.Convert(targetArg, method.DeclaringType), // тип в котором объявлен метод
: Expression.Convert(targetArg, method.DeclaringType), // Method's type
method,
parameters.Select((p, i) =>
Expression.Convert(Expression.ArrayIndex(argsArg, Expression.Constant(i)), p.ParameterType)));

@ -8,7 +8,7 @@ namespace ZeroLevel.Services.Reflection
#region TypeHelpers
/// <summary>
/// Сonverting a string to a type, if there is a corresponding converter for the type, in the absence of a converter, the default state for the specified type is returned
/// Converting a string to a type, if there is a corresponding converter for the type, in the absence of a converter, the default state for the specified type is returned
/// </summary>
public static object TryConvert(string input, Type to)
{

@ -84,7 +84,7 @@ namespace ZeroLevel.Services.Shedulling
/// Performs an action once per period, while the date is recalculated from the function transferred each time the task is recreated.
/// </summary>
/// <param name="nextEventDateCalcFunction">The function to calculate the next date</param>
/// <param name="callback">Действие</param>
/// <param name="callback">Action</param>
/// <returns>Task ID</returns>
public long RemindAsyncEveryNonlinearDate(Func<DateTime, DateTime> nextEventDateCalcFunction,
Func<long, Task> callback,

Loading…
Cancel
Save

Powered by TurnKey Linux.