Конфигурация приложения и Inversion Of Control (IoC) and Dependancy Injection (DI) containers

11.07.2009 at 11:38 3 комментария

Масштабируемая конфигурация приложения

Размышляя над тем как сделать конфигурацию довольно большого приложения более гибкой составил список требований к системе конфигурации:

  1. Легко добавлять новые настройки для новых классов/модулей
  2. Легко изменить хранилище настроек (XML, DB)
  3. Настройки можно менять программно

Наиболее частый сценарий в большом приложении: Необходимо добавить новую подсистему.

  1. Создаем раздел настроек для новой подсистемы
  2. Создаем саму подсистему
  3. Используем настройки в новой подсистеме

Второй сценарий: Модифицируем существующую подсистему (например подсистема загрузки и изменения размера фотографий). Предположим нужно добавить настройки, для задания качества сжатия.

  1. Добавляем параметр в существующий раздел настроек для этой подсистемы
  2. Используем параметр внутри подсистемы

Основаная задача, чтобы остальное приложение как можно меньше затрагивалось при добавлении новой подсистемы и, чтобы настройки основного приложения также минимально или совсем не затрагивались новым разделом настроек. Другими словами, чтобы масштабирование/развитие приложения было простым.

Для реализации первого требования: легко добавлять новые настройки для новых классов/модулей, можно использовать такой подход. Для каждой подсистемы создается свой класс с настройками.

Для реализации второго требования, легко изменять хранилище настроек (XML, DB) можно не просто создавать свой класс с настройками как решено выше, а создавать его в отдельном модуле и использовать в виде интерфейса, и создавать разные реализации. Затем, чтобы подсистема не зависела от конкретной реализации интерфейса настроек, необходимо сделать фабрику класса настроек

Для решения третьего требования, необходимо чтобы реализации классов настроек поддерживали свойства настроек на чтение и запись. А также чтобы класс настроек был в одном экземпляре на время жизни приложения.

Таким образом получается что для первого сценария, создание новой подсистемы необходимо выполнить следующие шаги

  1. Создать интерфейс с настройками, например IImageSubsystemSettings
  2. Создать реализацию настроек, например ImageSusbsystemSettingsAppConfig
  3. Создать фабрику класса настроек ImageSettingsFactory

Несмотря на то, что реализуется требование масштабируемости и незатрагивания других частей приложения, получается довольно много действий. Вот тут я вспомнил про IoC StructureMap. Она реализует шаблон ServiceLocator, и позволяет создавать реализации интерфейсов не зная о конкретной реализации.

Таким образом эта библиотека позволяет избавится от создания фабрики класса настроек ImageSettingsFactory. В конфигурации StructureMap можно задать интерфейс IImageSubsystemSettings и связать с классом реализующим этот интерфейс. Благодаря этому, мы не только избавляемся от необходимости создавать фабрику для каждого класса настроек, но еще и сводим все классы настроек в один конфигурационный файл и легко можем подменить реализации этих классов. Также эта библиотека позволяет задать в конфигурации, что класс является синглтоном, в результате с нулевыми усилиями мы реализуем третье требование (возможность менять настройки программно).

Есть еще одна проблема: для того чтобы можно было создавать разные реализации классов настроек, необходимо вынести интерфейс настроек для конкретной подсистемы в отдельный проект (речь о проекте на C#). Иначе возникнут кольцевые ссылки. Если интерфейс оставить в том же проекте, что и подсистема, при создании новой реализации интерфейса настроек в отдельном модуле, потребуется сослаться на модуль с подсистемой, для которой реализуется интерфейс настроек, а подсистема в свою очередь будет использовать новую реализацию интерфейса настроек. (Возможно это допустимо, потому что IoC контейнеры создают классы через reflection, надо проверить)

 

Библиотеки IoC и DI

Узнать подробнее об Inversion of Control Containers and the Dependency Injection pattern . Также можно посмотреть видео Introduction to IoC/DI — The art of Decoupling

Я давно пользуюсь StructureMap, но решил узнать больше о существующих IoC контейнерах и самое главное разобраться как лучше их использовать.

Самые популярные библиотеки нашел на сайте CSharp-source.net

Заинтересовала библиотека autofac. Она интенсивно использует возможности C#3.0. Хотя StructureMap также можно использовать в “современном стиле” как описано в статье Introduction To StructureMap.

Выводы

Несмотря на то что добавление каждой новой подсистемы потребует создание дополнительного интерфейса, и реализации настроек, действия требуемые для добавления подсистемы в проект получаются одинаковыми, а это как раз то, что нужно для больших приложений. А IoC фрэймворк позволит переключить реализацию настроек и использовать шаблон ServiceLocator для создания не только классов настроек, но и других классов, которые потенциально могут иметь другую реализацию.

Это удобно даже если реализация на данный момент не требуется реализовывать другое хранилище настроек.

Конечно во всем нужен баланс, нет необходимости все классы создавать через IoC библиотеку. Для себя я вывел следующее правило.

Роли классов

  • Сервис — класс выполняющий большую работу и использующий другие классы
  • Репозиторий — класс отвечающий за хранение и выборку коллекций объектов
  • Вспомогательный класс — реализующий одну операцию, с очень четкой зоной ответственности. В приложении самое большое количество именно этих классов. (я не смог подобрать лучшего имени, но речь идет не о классах Helpers а именно о классах выполняющих простую операцию)
  • Модель (бизнес объект) — класс предметной области, как правило лишь хранит данные
  • Класс настроек – класс содержащий настройки

Использовать IoC имеет смысл для классов настроек и Репозитория. Для классов Сервис (только если планируется создание разных реализаций).

Для классов Модель и Вспомогательных создание через IoC не требуется. Их лучше создавать через new, благодаря этому основные и самые частые операции в приложении будут выполняться эффективно, а код останется простым и понятным.

 

Ссылки

IoC and DI

 

StructureMap

Ninject

Autofac

Реклама

Entry filed under: Программирование. Tags: , , , , , , , .

Подключение log4net к приложению Получение профиля пользователя по имени пользователя

3 комментария Add your own

  • 1. RiliBoobe  |  01.10.2009 в 22:32

    >>>Секреты контакта<<<

    Я бы общался вконтакте чаще но тупое добавление фоток, друзей, групп мягко говоря напрягает. Когда увидел рекламу на этот сайт подумал что какойто левак. Был не прав, признаю. Все что здесь обещают реально работает. Теперь мне не надо тратить время на формальности, я трачу его на дело 😉

    >>>Взлом контакта<<<

    Ответить
  • 2. Aleksey  |  17.10.2009 в 15:38

    Продажа скутеров, мопедов из Японии и Китая. Каталог скутеров из Китая, скутеры производителей Сузуки и Хонда. Все японские и китайские мопеды. Ремонт и обслуживание скутеров и другой мото техники. Огромный спектр услуг, невысокие цены, индивидуальный подход и высочайшее качество обслуживания. Мото техника в Одессе на JPmoto.Net. Самый большой ассортимент товара в городе.

    Ответить
  • 3. Люся  |  22.10.2009 в 23:06

    Вы продвигаете сайт, при этом у вас нет желания платить деньги? Тогда вы точно попали туда, куда нужно! Общетематический каталог статей ArticleBox — неплохой способ получить необходимый результат. Продвижение статьями на нашем сайте обязательно пойдет на пользу. ArticleBox. Org. UA всегда работает на вас. Мы всегда рады видеть вас на нашем ресурсе.

    Ответить

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Subscribe to the comments via RSS Feed


Google Custom Search Engine

Мой GCE по ASP.NET блогам
Все желающие могут добавлять в него блоги и сайты по asp.net и вебпрограммной тематике

Свежие записи

RSS Некоторые посты из блогов, которые я читаю

  • Произошла ошибка; возможно, лента недоступна. Повторите попытку позже.

Страницы

Июль 2009
Пн Вт Ср Чт Пт Сб Вс
« Июн   Авг »
 12345
6789101112
13141516171819
20212223242526
2728293031  

%d такие блоггеры, как: