Auto status change to "Under Review"
@@ -0,0 +1,100 | |||||
|
1 | # XML Конфигурация IoC контейнера | |||
|
2 | ||||
|
3 | Данная библиоетка создавалась для загрузки и применения конфигурации к IoC контейнеру, она не предназначена для конфигурирования | |||
|
4 | контейнера во время выполнения, большинство контейнеров уже обладают данным функционалом. | |||
|
5 | ||||
|
6 | На данный момент поддерживается единственный вид контейнера - [Unity Container](https://unitycontainer.github.io/) | |||
|
7 | ||||
|
8 | Unity уже обладает средствами загрузки конфигурации из XML, данная библиотека позволяет решать следующие задачи | |||
|
9 | ||||
|
10 | - Конфигурация является простым Xml документом, который можно получить из любого источика и не ограничивается `.config` файлами приложения | |||
|
11 | - Включение существующе конфигурации `<include href='config.xml'/>` в текущую | |||
|
12 | - Поддержка сериализованных объектов в качестве регистраций сервисов и параметров | |||
|
13 | - Описание зависимостей может быть расширено собсвтенными элементами с произвольной структурой | |||
|
14 | - Поддержка специфиакции генериков любой вложенности `Dictionary{Foo,Bar{Int32}}` | |||
|
15 | ||||
|
16 | ## Общая архитектура | |||
|
17 | ||||
|
18 | `Implab.ServiceHost.Unity` содержит в себе классы для загрузки и применения XML конфигурации к IoC контейнеру, в частности к Unity. | |||
|
19 | ||||
|
20 | 1. Настраивается схема `ContainerConfigurationSchema` | |||
|
21 | 2. Загружается документ и десереализуется в виде `ContainerElement` | |||
|
22 | 3. Создается `ContainerBuilder` при помощи которого применяются настройки из `ContainerElement` | |||
|
23 | ||||
|
24 | `ContainerConfigurationSchema` - определяет элементы которые могут быть использованы в конфигурации контейнера, предоставляет настроенный `XmlSerializer`. | |||
|
25 | ||||
|
26 | `ContainerBuilder` - основной класс, который используется для применения конфигурации к контейнеру, добавляет записи регистрации сервисов. | |||
|
27 | ||||
|
28 | `ContainerElement` - Корневой элемент конфигурации, который загружается из документа. | |||
|
29 | ||||
|
30 | Классы заканчивающиеся словом `Builder` используются для применения конфигурации к контейнеру, | |||
|
31 | классы заканчивающиеся на `Element` содержат информацию о конфигурации и десериализуются из исходного документа. | |||
|
32 | ||||
|
33 | ## Структура конфигурации контейнера | |||
|
34 | ||||
|
35 | Элемент верхнего уровня всегда `ContainerElemnt`, он используется для хранения набора элеметов, которые распознаются и выполняются `ContainerBuilder`. | |||
|
36 | ||||
|
37 | Все элементы, входящие в контейнер наследуются от абстрактного класса `ContainerItemElement`, | |||
|
38 | который позволяет получить текущий `ContainerBuilder` и выполнить над ним какие-либо действия. | |||
|
39 | ||||
|
40 | Примерами элементов контейнера могут быть | |||
|
41 | ||||
|
42 | - `<include href='config.xml'/>` - включение конфигурации из указанного места | |||
|
43 | - `<namespace name='My.App'/>` - добавление пространства имен для поиска типов | |||
|
44 | - `<register type='MyGenericType{}'/>` - добавление в контейнер регистрации типа ``My.App.MyGenericType`1`` | |||
|
45 | ||||
|
46 | Полный набор элементов, доступных для использования в контейнере определяет схема `ContainerConfigurationSchema`, | |||
|
47 | разработчик может расширить контейнер совими собственными элементами зарегистрировав их в схеме. | |||
|
48 | ||||
|
49 | Например, мы используем компоненту `MyHttpClient` для загрузки данных | |||
|
50 | ||||
|
51 | ```xml | |||
|
52 | <register type="IClient" mapTo="MyHttpClient"> | |||
|
53 | <property name="proxy"> | |||
|
54 | <value>socks5://proxy1.my.company</value> | |||
|
55 | </property> | |||
|
56 | </register> | |||
|
57 | ``` | |||
|
58 | ||||
|
59 | При частом использовании можно сделать описание конфигурации несколько проще, | |||
|
60 | описав новый эелемент конфигурации | |||
|
61 | ||||
|
62 | ```csharp | |||
|
63 | public class MyHttpClientElement : ContainerItemElement { | |||
|
64 | ||||
|
65 | public string Proxy { get; set; } | |||
|
66 | ||||
|
67 | public override void Visit(ContainerBuilder builder) { | |||
|
68 | // создаем описание элемента | |||
|
69 | var registration = new RegistrationElement { | |||
|
70 | RegistrationType = "IClient", | |||
|
71 | ImplementationType = "My.App.MyHttpClient", | |||
|
72 | Injectors = new [] { | |||
|
73 | new PropertyInjectionElement { | |||
|
74 | Name = "Proxy", | |||
|
75 | Value = ValueParameterElement { | |||
|
76 | Value = Proxy | |||
|
77 | } | |||
|
78 | } | |||
|
79 | } | |||
|
80 | }; | |||
|
81 | ||||
|
82 | // применяем созданное описание к контейнеру | |||
|
83 | builder.Visit(registration) | |||
|
84 | } | |||
|
85 | } | |||
|
86 | ``` | |||
|
87 | ||||
|
88 | Регистрируем новый элемент в схеме | |||
|
89 | ||||
|
90 | ```csharp | |||
|
91 | schema.RegisterContainerElement<MyHttpClientElement>("http"); | |||
|
92 | ``` | |||
|
93 | ||||
|
94 | Используем новый элемент в конфигурации | |||
|
95 | ||||
|
96 | ```xml | |||
|
97 | <http> | |||
|
98 | <proxy>socks5://proxy1.my.company</propxy> | |||
|
99 | </http> | |||
|
100 | ``` No newline at end of file |
General Comments 3
ok, latest stable version should be in default
You need to be logged in to leave comments.
Login now