changeset 281:e0916ddc9950 v3 tip

code cleanup and refactoring
author cin
date Fri, 01 Jun 2018 21:35:24 +0300
parents f07be402ab02
children
files Implab.ServiceHost/Implab.ServiceHost.csproj Implab.ServiceHost/Unity/AbstractInjectionParameter.cs Implab.ServiceHost/Unity/ArrayParameterElement.cs Implab.ServiceHost/Unity/ConstructorInjectionElement.cs Implab.ServiceHost/Unity/DefaultParameterElement.cs Implab.ServiceHost/Unity/DependencyParameterElement.cs Implab.ServiceHost/Unity/FactoryElement.cs Implab.ServiceHost/Unity/InjectionParameterElement.cs Implab.ServiceHost/Unity/InjectionValueBuilder.cs Implab.ServiceHost/Unity/MethodInjectionElement.cs Implab.ServiceHost/Unity/PropertyInjectionElement.cs Implab.ServiceHost/Unity/ProvidesElement.cs Implab.ServiceHost/Unity/SerializedParameterElement.cs Implab.ServiceHost/Unity/ValueParameterElement.cs Implab.ServiceHost/docs/XmlConfiguration.md Implab/Diagnostics/ChannelAdvertisementEventArgs.cs Implab/Diagnostics/Trace.cs Implab/Implab.csproj Implab/Messaging/ISession.cs
diffstat 19 files changed, 105 insertions(+), 54 deletions(-) [+]
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