annotate Implab.ServiceHost/docs/XmlConfiguration.md @ 281:e0916ddc9950 v3 tip

code cleanup and refactoring
author cin
date Fri, 01 Jun 2018 21:35:24 +0300
parents 963b17c275be
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
1 # XML Конфигурация IoC контейнера
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
2
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
3 Библиоетка создавалась для загрузки и применения конфигурации к IoC контейнеру, она не предназначена для конфигурирования
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
4 контейнера во время выполнения, большинство контейнеров уже обладают данным функционалом.
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
5
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
6 На данный момент поддерживается единственный вид контейнера - [Unity Container](https://unitycontainer.github.io/)
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
7
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
8 Unity уже обладает средствами загрузки конфигурации из XML, данная библиотека реализует аналогичный функционал, кроме того, позволяет решать следующие задачи:
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
9
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
10 - Конфигурация является простым Xml документом, который можно получить из любого источика и не ограничивается `.config` файлами приложения
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
11 - Включение существующе конфигурации `<include href='config.xml'/>` в текущую
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
12 - Поддержка сериализованных объектов в качестве регистраций сервисов и параметров
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
13 - Поддержка специфиакции генериков любой вложенности, например `Dictionary{Foo,Bar{Int32}}`
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
14 - Поддержка фабрик в XML конфигурации
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
15 - Расширение схемы XML конфигурации собственными элементами
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
16
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
17 ## Общая архитектура
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
18
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
19 Пространство имен `Implab.ServiceHost.Unity` содержит в себе классы для загрузки и применения XML конфигурации к IoC контейнеру.
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
20
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
21 Применение конфигурации к контейнеру состоит из следующих основных шагов:
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
22
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
23 1. Настраивается схема `ContainerConfigurationSchema` XML конфигурации контейнера
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
24 2. Загружается документ и десереализуется в виде `ContainerElement`
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
25 3. Создается `ContainerBuilder` при помощи которого применяются настройки из `ContainerElement` к контейнеру
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
26
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
27 Схема `ContainerConfigurationSchema` определяет элементы документа, которые могут быть использованы в конфигурации контейнера, позволяет создать `XmlSerializer`, который используется для загрузки конфигурации.
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
28
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
29 `ContainerBuilder` - основной класс, который используется для применения конфигурации к контейнеру, он добавляет записи регистрации сервисов из конфигурации в контейнер.
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
30
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
31 `ContainerElement` - Конфигурация контейнера, которая загружается из документа, состоит из директив для `ContainerBuilder`, а также из записей регистрации сервисов.
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
32
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
33 В библиотеки приняты следующие правила именования классов:
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
34
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
35 - `***Builder` используются для применения конфигурации к контейнеру,
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
36 - `***Element` содержат информацию о конфигурации и десериализуются из исходного документа.
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
37
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
38 ## Структура конфигурации контейнера
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
39
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
40 Элемент верхнего уровня всегда `container`, он используется для хранения набора элеметов, которые распознаются и выполняются `ContainerBuilder`.
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
41
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
42 Все элементы, входящие в контейнер наследуются от абстрактного класса `ContainerItemElement`,
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
43 который позволяет получить текущий `ContainerBuilder` и выполнить над ним какие-либо действия.
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
44
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
45 Основные элементы конфигурации контенейра
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
46
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
47 - `<include href='config.xml'/>` - включение конфигурации из указанного места
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
48 - `<namespace name='My.App'/>` - добавление пространства имен для поиска типов
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
49 - `<register type='MyGenericType{}'/>` - добавление в контейнер регистрации типа ``My.App.MyGenericType`1``
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
50 - `<factory type='IFactory{Foo}' mapTo ='MyFactory'/>` - фабрика, регистрирует свой тип, а также тип `Foo`
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
51 - `<serialized />` - сериализованный экземпляр объекта, использует `XmlSerializer` для десериализации
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
52 - `<value />` - значение объекта в виде строки, используется для простых типов
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
53
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
54 Полный набор элементов, доступных для использования в контейнере определяет схема `ContainerConfigurationSchema`,
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
55 разработчик может расширить контейнер совими собственными элементами зарегистрировав их в схеме.
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
56
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
57 ### register
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
58
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
59 О
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
60
e0916ddc9950 code cleanup and refactoring
cin
parents: 277
diff changeset
61
276
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
62 Например, мы используем компоненту `MyHttpClient` для загрузки данных
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
63
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
64 ```xml
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
65 <register type="IClient" mapTo="MyHttpClient">
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
66 <property name="proxy">
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
67 <value>socks5://proxy1.my.company</value>
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
68 </property>
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
69 </register>
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
70 ```
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
71
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
72 При частом использовании можно сделать описание конфигурации несколько проще,
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
73 описав новый эелемент конфигурации
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
74
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
75 ```csharp
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
76 public class MyHttpClientElement : ContainerItemElement {
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
77
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
78 public string Proxy { get; set; }
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
79
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
80 public override void Visit(ContainerBuilder builder) {
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
81 // создаем описание элемента
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
82 var registration = new RegistrationElement {
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
83 RegistrationType = "IClient",
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
84 ImplementationType = "My.App.MyHttpClient",
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
85 Injectors = new [] {
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
86 new PropertyInjectionElement {
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
87 Name = "Proxy",
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
88 Value = ValueParameterElement {
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
89 Value = Proxy
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
90 }
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
91 }
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
92 }
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
93 };
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
94
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
95 // применяем созданное описание к контейнеру
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
96 builder.Visit(registration)
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
97 }
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
98 }
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
99 ```
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
100
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
101 Регистрируем новый элемент в схеме
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
102
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
103 ```csharp
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
104 schema.RegisterContainerElement<MyHttpClientElement>("http");
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
105 ```
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
106
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
107 Используем новый элемент в конфигурации
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
108
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
109 ```xml
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
110 <http>
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
111 <proxy>socks5://proxy1.my.company</propxy>
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
112 </http>
b4e0f81c7425 container configuration docs
cin
parents:
diff changeset
113 ```