Mercurial > pub > ImplabNet
changeset 281:e0916ddc9950 v3 tip
code cleanup and refactoring
line wrap: on
line diff
--- a/Implab.ServiceHost/Implab.ServiceHost.csproj Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Implab.ServiceHost.csproj Fri Jun 01 21:35:24 2018 +0300 @@ -3,6 +3,17 @@ <PropertyGroup> <TargetFrameworks>netstandard2.0;net46</TargetFrameworks> <FrameworkPathOverride Condition="'$(TargetFramework)'=='net46'">/usr/lib/mono/4.6-api/</FrameworkPathOverride> + <Authors>Sergey Smirnov</Authors> + <Title>Implab.SrviceHost library</Title> + <Description>Provides simple and flexible XML configuration for the Unity IoC</Description> + <Copyright>2018 Sergey Smirnov</Copyright> + <Version>1.0.0</Version> + <PackageLicenseUrl>https://hg.implab.org/pub/ImplabNet/file/tip/Implab/license.txt</PackageLicenseUrl> + <PackageProjectUrl>https://implab.org</PackageProjectUrl> + <RepositoryUrl>https://hg.implab.org/pub/ImplabNet/</RepositoryUrl> + <RepositoryType>mercurial</RepositoryType> + <PackageTags>IoC; Unity; Dependency Injection</PackageTags> + <TargetFrameworks>netstandard2.0;net46</TargetFrameworks> </PropertyGroup> <ItemGroup>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Implab.ServiceHost/Unity/AbstractInjectionParameter.cs Fri Jun 01 21:35:24 2018 +0300 @@ -0,0 +1,12 @@ +using System; +using System.Xml.Serialization; + +namespace Implab.ServiceHost.Unity { + public abstract class AbstractInjectionParameter : IInjectionParameter { + + [XmlAttribute("type")] + public string TypeName { get; set; } + + public abstract void Visit(InjectionParameterBuilder builder); + } +} \ No newline at end of file
--- a/Implab.ServiceHost/Unity/ArrayParameterElement.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Unity/ArrayParameterElement.cs Fri Jun 01 21:35:24 2018 +0300 @@ -2,7 +2,7 @@ namespace Implab.ServiceHost.Unity { - public class ArrayParameterElement : InjectionParameterElement { + public class ArrayParameterElement : AbstractInjectionParameter { [XmlAttribute("itemsType")] public string ItemsType { get; set; } @@ -11,7 +11,7 @@ [XmlElement("value", typeof(ValueParameterElement))] [XmlElement("serialized", typeof(SerializedParameterElement))] [XmlElement("default", typeof(DefaultParameterElement))] - public InjectionParameterElement[] Items { get; set; } + public AbstractInjectionParameter[] Items { get; set; } public override void Visit(InjectionParameterBuilder builder) { builder.Visit(this);
--- a/Implab.ServiceHost/Unity/ConstructorInjectionElement.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Unity/ConstructorInjectionElement.cs Fri Jun 01 21:35:24 2018 +0300 @@ -8,7 +8,7 @@ [XmlElement("serialized", typeof(SerializedParameterElement))] [XmlElement("default", typeof(DefaultParameterElement))] [XmlElement("array", typeof(ArrayParameterElement))] - public InjectionParameterElement[] Parameters { get; set; } + public AbstractInjectionParameter[] Parameters { get; set; } public override void Visit(TypeRegistrationBuilder builder) { builder.Visit(this);
--- a/Implab.ServiceHost/Unity/DefaultParameterElement.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Unity/DefaultParameterElement.cs Fri Jun 01 21:35:24 2018 +0300 @@ -1,6 +1,6 @@ namespace Implab.ServiceHost.Unity { - public class DefaultParameterElement : InjectionParameterElement { + public class DefaultParameterElement : AbstractInjectionParameter { public string Value { get { return null; } }
--- a/Implab.ServiceHost/Unity/DependencyParameterElement.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Unity/DependencyParameterElement.cs Fri Jun 01 21:35:24 2018 +0300 @@ -1,7 +1,7 @@ using System.Xml.Serialization; namespace Implab.ServiceHost.Unity { - public class DependencyParameterElement : InjectionParameterElement { + public class DependencyParameterElement : AbstractInjectionParameter { [XmlAttribute("name")] public string DependencyName { get; set; }
--- a/Implab.ServiceHost/Unity/FactoryElement.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Unity/FactoryElement.cs Fri Jun 01 21:35:24 2018 +0300 @@ -36,7 +36,8 @@ Name = item.RegistrationName, RegistrationType = builder.ResolveType(item.RegistrationType), FactoryName = Name, - FactoryType = factoryType + FactoryType = factoryType, + Lifetime = item.Lifetime.GetLifetime(builder) }; builder.Visit(activator); }
--- a/Implab.ServiceHost/Unity/InjectionParameterElement.cs Fri May 25 19:15:26 2018 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -using System; -using System.Xml.Serialization; - -namespace Implab.ServiceHost.Unity { - public abstract class InjectionParameterElement : IInjectionParameter { - - [XmlAttribute("type")] - public string TypeName { get; set; } - - public abstract void Visit(InjectionParameterBuilder builder); - } -} \ No newline at end of file
--- a/Implab.ServiceHost/Unity/InjectionValueBuilder.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Unity/InjectionValueBuilder.cs Fri Jun 01 21:35:24 2018 +0300 @@ -98,7 +98,7 @@ if (itemsType == null) throw new Exception("Failed to determine array elements type"); - InjectionParameterValue[] injections = (arrayParameter.Items ?? new InjectionParameterElement[0]) + InjectionParameterValue[] injections = (arrayParameter.Items ?? new AbstractInjectionParameter[0]) .Select(x => { var builder = new InjectionParameterBuilder(m_resolver, itemsType); x.Visit(builder);
--- a/Implab.ServiceHost/Unity/MethodInjectionElement.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Unity/MethodInjectionElement.cs Fri Jun 01 21:35:24 2018 +0300 @@ -11,7 +11,7 @@ [XmlElement("serialized", typeof(SerializedParameterElement))] [XmlElement("default", typeof(DefaultParameterElement))] [XmlElement("array", typeof(ArrayParameterElement))] - public InjectionParameterElement[] Parameters { get; set; } + public AbstractInjectionParameter[] Parameters { get; set; } public override void Visit(TypeRegistrationBuilder context) { context.Visit(this);
--- a/Implab.ServiceHost/Unity/PropertyInjectionElement.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Unity/PropertyInjectionElement.cs Fri Jun 01 21:35:24 2018 +0300 @@ -11,7 +11,7 @@ [XmlElement("serialized", typeof(SerializedParameterElement))] [XmlElement("default", typeof(DefaultParameterElement))] [XmlElement("array", typeof(ArrayParameterElement))] - public InjectionParameterElement Value { get; set; } + public AbstractInjectionParameter Value { get; set; } public override void Visit(TypeRegistrationBuilder context) { context.Visit(this);
--- a/Implab.ServiceHost/Unity/ProvidesElement.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Unity/ProvidesElement.cs Fri Jun 01 21:35:24 2018 +0300 @@ -7,5 +7,11 @@ [XmlAttribute("name")] public string RegistrationName { get; set; } + + [XmlElement("signleton", typeof(SingletonLifetimeElement))] + [XmlElement("context", typeof(ContextLifetimeElement))] + [XmlElement("container", typeof(ContainerLifetimeElement))] + [XmlElement("hierarchy", typeof(HierarchicalLifetimeElement))] + public LifetimeElement Lifetime {get; set;} } } \ No newline at end of file
--- a/Implab.ServiceHost/Unity/SerializedParameterElement.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Unity/SerializedParameterElement.cs Fri Jun 01 21:35:24 2018 +0300 @@ -5,7 +5,7 @@ namespace Implab.ServiceHost.Unity { - public class SerializedParameterElement : InjectionParameterElement { + public class SerializedParameterElement : AbstractInjectionParameter { [XmlAttribute("href")] public string Location { get; set; }
--- a/Implab.ServiceHost/Unity/ValueParameterElement.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/Unity/ValueParameterElement.cs Fri Jun 01 21:35:24 2018 +0300 @@ -2,7 +2,7 @@ using System.Xml.Serialization; namespace Implab.ServiceHost.Unity { - public class ValueParameterElement : InjectionParameterElement { + public class ValueParameterElement : AbstractInjectionParameter { [XmlAttribute("value")] public string Value { get; set; }
--- a/Implab.ServiceHost/docs/XmlConfiguration.md Fri May 25 19:15:26 2018 +0300 +++ b/Implab.ServiceHost/docs/XmlConfiguration.md Fri Jun 01 21:35:24 2018 +0300 @@ -1,51 +1,64 @@ # XML Конфигурация IoC контейнера -Данная библиоетка создавалась для загрузки и применения конфигурации к IoC контейнеру, она не предназначена для конфигурирования +Библиоетка создавалась для загрузки и применения конфигурации к IoC контейнеру, она не предназначена для конфигурирования контейнера во время выполнения, большинство контейнеров уже обладают данным функционалом. На данный момент поддерживается единственный вид контейнера - [Unity Container](https://unitycontainer.github.io/) -Unity уже обладает средствами загрузки конфигурации из XML, данная библиотека позволяет решать следующие задачи +Unity уже обладает средствами загрузки конфигурации из XML, данная библиотека реализует аналогичный функционал, кроме того, позволяет решать следующие задачи: - Конфигурация является простым Xml документом, который можно получить из любого источика и не ограничивается `.config` файлами приложения - Включение существующе конфигурации `<include href='config.xml'/>` в текущую - Поддержка сериализованных объектов в качестве регистраций сервисов и параметров -- Описание зависимостей может быть расширено собсвтенными элементами с произвольной структурой -- Поддержка специфиакции генериков любой вложенности `Dictionary{Foo,Bar{Int32}}` +- Поддержка специфиакции генериков любой вложенности, например `Dictionary{Foo,Bar{Int32}}` +- Поддержка фабрик в XML конфигурации +- Расширение схемы XML конфигурации собственными элементами ## Общая архитектура -`Implab.ServiceHost.Unity` содержит в себе классы для загрузки и применения XML конфигурации к IoC контейнеру, в частности к Unity. +Пространство имен `Implab.ServiceHost.Unity` содержит в себе классы для загрузки и применения XML конфигурации к IoC контейнеру. + +Применение конфигурации к контейнеру состоит из следующих основных шагов: -1. Настраивается схема `ContainerConfigurationSchema` +1. Настраивается схема `ContainerConfigurationSchema` XML конфигурации контейнера 2. Загружается документ и десереализуется в виде `ContainerElement` -3. Создается `ContainerBuilder` при помощи которого применяются настройки из `ContainerElement` +3. Создается `ContainerBuilder` при помощи которого применяются настройки из `ContainerElement` к контейнеру -`ContainerConfigurationSchema` - определяет элементы которые могут быть использованы в конфигурации контейнера, предоставляет настроенный `XmlSerializer`. +Схема `ContainerConfigurationSchema` определяет элементы документа, которые могут быть использованы в конфигурации контейнера, позволяет создать `XmlSerializer`, который используется для загрузки конфигурации. -`ContainerBuilder` - основной класс, который используется для применения конфигурации к контейнеру, добавляет записи регистрации сервисов. +`ContainerBuilder` - основной класс, который используется для применения конфигурации к контейнеру, он добавляет записи регистрации сервисов из конфигурации в контейнер. -`ContainerElement` - Корневой элемент конфигурации, который загружается из документа. +`ContainerElement` - Конфигурация контейнера, которая загружается из документа, состоит из директив для `ContainerBuilder`, а также из записей регистрации сервисов. -Классы заканчивающиеся словом `Builder` используются для применения конфигурации к контейнеру, -классы заканчивающиеся на `Element` содержат информацию о конфигурации и десериализуются из исходного документа. +В библиотеки приняты следующие правила именования классов: + +- `***Builder` используются для применения конфигурации к контейнеру, +- `***Element` содержат информацию о конфигурации и десериализуются из исходного документа. ## Структура конфигурации контейнера -Элемент верхнего уровня всегда `ContainerElemnt`, он используется для хранения набора элеметов, которые распознаются и выполняются `ContainerBuilder`. +Элемент верхнего уровня всегда `container`, он используется для хранения набора элеметов, которые распознаются и выполняются `ContainerBuilder`. Все элементы, входящие в контейнер наследуются от абстрактного класса `ContainerItemElement`, который позволяет получить текущий `ContainerBuilder` и выполнить над ним какие-либо действия. -Примерами элементов контейнера могут быть +Основные элементы конфигурации контенейра - `<include href='config.xml'/>` - включение конфигурации из указанного места - `<namespace name='My.App'/>` - добавление пространства имен для поиска типов - `<register type='MyGenericType{}'/>` - добавление в контейнер регистрации типа ``My.App.MyGenericType`1`` +- `<factory type='IFactory{Foo}' mapTo ='MyFactory'/>` - фабрика, регистрирует свой тип, а также тип `Foo` +- `<serialized />` - сериализованный экземпляр объекта, использует `XmlSerializer` для десериализации +- `<value />` - значение объекта в виде строки, используется для простых типов Полный набор элементов, доступных для использования в контейнере определяет схема `ContainerConfigurationSchema`, разработчик может расширить контейнер совими собственными элементами зарегистрировав их в схеме. +### register + +О + + Например, мы используем компоненту `MyHttpClient` для загрузки данных ```xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Implab/Diagnostics/ChannelAdvertisementEventArgs.cs Fri Jun 01 21:35:24 2018 +0300 @@ -0,0 +1,17 @@ +using System; +using System.Diagnostics; + +namespace Implab.Diagnostics +{ + public class ChannelAdvertisementEventArgs : EventArgs { + internal ChannelAdvertisementEventArgs(object channelId, TraceSource source) { + ChannelId = channelId; + Source = source; + } + + public object ChannelId { get; private set; } + + public TraceSource Source { get; private set; } + + } +} \ No newline at end of file
--- a/Implab/Diagnostics/Trace.cs Fri May 25 19:15:26 2018 +0300 +++ b/Implab/Diagnostics/Trace.cs Fri Jun 01 21:35:24 2018 +0300 @@ -1,4 +1,7 @@ -using System; +// enable System.Diagnostics trace methods +#define TRACE + +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -9,7 +12,21 @@ namespace Implab.Diagnostics { public static class Trace<T> { - public static TraceSource TraceSource { get; } = new TraceSource(typeof(T).Name); + static Lazy<TraceSource> _traceSource = new Lazy<TraceSource>(CreateChannel, LazyThreadSafetyMode.ExecutionAndPublication); + + static int _nextId; + + static TraceSource CreateChannel() { + var id = Interlocked.Increment(ref _nextId); + return new TraceSource(typeof(T).Name); + } + + public static TraceSource TraceSource { get { return _traceSource.Value; } } + + public static IDisposable Subscribe() { + + throw new NotImplementedException(); + } #if NETFX_TRACE_BUG readonly static AsyncLocal<object> m_currentOperation = new AsyncLocal<object>();
--- a/Implab/Implab.csproj Fri May 25 19:15:26 2018 +0300 +++ b/Implab/Implab.csproj Fri Jun 01 21:35:24 2018 +0300 @@ -8,7 +8,7 @@ and SharedLock, Trace helpers on top of System.Diagnostics, ObjectPool etc. </Description> <Copyright>2012-2018 Sergey Smirnov</Copyright> - <Version>3.0.10</Version> + <Version>3.0.12</Version> <PackageLicenseUrl>https://hg.implab.org/pub/ImplabNet/file/tip/Implab/license.txt</PackageLicenseUrl> <PackageProjectUrl>https://implab.org</PackageProjectUrl> <RepositoryUrl>https://hg.implab.org/pub/ImplabNet/</RepositoryUrl>
--- a/Implab/Messaging/ISession.cs Fri May 25 19:15:26 2018 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -namespace Implab.Messaging { - public interface ISession { - /// <summary> - /// Starts message consumers, call this method after all adapters are ready - /// </summary> - void Start(); - - /// <summary> - /// Stops message consumers - /// </summary> - void Stop(); - - } -} \ No newline at end of file