+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 91.78 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

Разработка архитектуры приложения с использованием инверсии зависимости

16.11.2012 12:26
Elfet

В этой статье я хочу ещё раз поговорить о разработке архитектуры приложения с использованием инверсии зависимости (Inversion of Control). 
Я уже писал о библиотеке IoC и о Modular. Теперь я пошел ещё дальше и упростил все что только можно и попробую объяснить принципы построения архитектуры. А так же расскажу о новой библиотеке Granula

Давайте представим, что мы хотим сделать библиотеку для управления пользователями на сайте. Первое что нам понадобится, это место где мы будем хранить информацию о 
наших пользователях. 
Опишем интерфейс хранилища:

interface StorageInterface
{
    public function set($key, $value);
    public function get($key);
    public function save();
    public function load();
}

Отлично, теперь нам нужна реализация этого интерфейса. Для начала будем хранить информацию в файлах. Создадим класс FileStorage.
FileStorage.php
class FileStorage implements StorageInterface
{
    private $file = 'data.json';
    private $data = array();	

    public function set($key, $value)
    {
    	$this->data[$key] = $value;
    }

    public function get($key) 
    {
    	return $this->data[$key];
    }

    public function save()
    {
 	file_put_contents($this->file, json_encode($this->data));
    }

    public function load()
    {
    	$this->data = json_decode(file_get_contents($this->file));
    }
}


Теперь создадим класс пользователя

class User
{
    public function __construct(StorageInterface $storage)
    {
    }
}

Теперь чтобы создать экземпляр класса User: 

$user = new User(new FileStorage());

Отлично, а что если какой-нибудь другой программист захочет вместо файлов использовать базу данных? Для этого ему нужно создать класс DatabaseStorage, реализовать интерфейс StorageInterface и заменить все вхождения FileStorage. Но изменение библиотеки сулит проблемы с её обновлениями.
Что бы этого избежать, давайте, введём опции:

$options = array(
    'StorageInterface' => 'FileStorage',
);

$user = new User($option['StorageInterface']);

Теперь что бы заменить FileStorage на DatabaseStorage, нужно всего лишь указать это в опциях:

$options['StorageInterface'] = 'DatabaseStorage';

То, что мы сейчас назвали опциями, на самом деле является контейнером IoC. 

Именно такая архитектура позволяет строить наиболее гибкие приложения и библиотеки. 
В своей предыдущей статье я рассказывал о библиотеке Modular, я продолжил развивать её, постарался упростить все для наилучшего понимания. Её основной задачей является обучение применения IoC на практике, создания модульной архитектуры приложения. 

Теперь она называется Granula. 

Любая библиотека может быть модулем для гранулы. Например из компонентов Symfony Components можно создать MVC приложение на подобии самой Symfony. 

Каждый модуль гранулы должен быть описан своим классом:

use Granula\Module;
use Inversion\Container;
 
class MyModule extends Module
{
    public function build(Container $container)
    {
        // Опишите свой модуль здесь.
    }
}

Например, описание библиотеки, которую мы создавали в начале статьи будет таким:

$container['StorageInterface'] = 'FileStorage';

Можно даже сократить ещё больше:

$container[] = 'FileStorage';

Но в таком случае не будет работать ленивая загрузка классов, так как FileStorage будет загруженInversion(библиотекой IoC контейнеров) сразу для определения его интерфейсов.

Пример описания модуля для Symfony Routing Component
        $container['request']
            = $container['Symfony\Component\HttpFoundation\Request']
            = new Factory('Symfony\Component\HttpFoundation\Request', 'createFromGlobals');

        $container['Symfony\Component\Config\FileLocator']
            = 'Symfony\Component\Config\FileLocator';

        $container['Doctrine\Common\Annotations\Reader']
            = 'Doctrine\Common\Annotations\AnnotationReader';

        $container['Symfony\Component\Routing\Loader\AnnotationClassLoader']
            = 'Granula\Router\AnnotatedRouteControllerLoader';

        $container['Symfony\Component\Config\Loader\LoaderInterface']
            = 'Symfony\Component\Routing\Loader\AnnotationDirectoryLoader';

        $container['request.context']
            = $container['Symfony\Component\Routing\RequestContext']
            = new Service('Symfony\Component\Routing\RequestContext');

        $container['router']
            = $container['Symfony\Component\Routing\RouterInterface']
            = new Factory('Granula\Router\RouterFactory');


Теперь можно создавать экземпляры как в Symfony при помощи контейнера:

$object = $container->get('Class');

Либо при момощи фабрики (при использовании trait):

$user = User::create();

Затем все необходимые модули указываются в Front Controller: 

class App extends Granula\App
{
    public function register()
    {
        return array(
            new MyModule(),
            // Список модулей
        );
    }
}

И в файле index.php запускаются:

$app = new App();
$app->run();

Я оформил все необходимые модули для создания полноценного MVC приложения. Что бы поиграться с ним используйте Composer для установки:

composer create-project granula/app www

В него включены:

  • Symfony Components
  • Twig
  • Doctrine ORM

Ссылки по теме

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года