Паттерн DI (dependencyinjection) иIoC-контейнеры[6]давно стали неотъемлемой частью любых крупных проектов. Благодаря им можно построить так называемый слабосвязанный код. Inversion of Control – это паттерн, поручающий компоненте управление каким-нибудь объектом. АDependency Injection позволяет автоматически получить из контейнера нужные нам зависимости при инициализации. Ими активно пользуются многие программисты. Представителей данных библиотек на данный момент очень много, в проекте рассмотреныIOC-контейнерыNinject[10], Unity[9], Autofac[12], MEF[11]и другие. Все они постоянно развиваются, пытаясь улучшить существующую модель.
1.2. Задача
Задача состоит в реализации принципа инверсии зависимости[6] с использованием ASPECT.NET[5] и вынесении IOC-контейнеров в аспекты. Помимо методологии ручного вынесения контейнеров требуется автоматизация данной теории посредством технологии MSRoslyn[18].
1.3. Актуальность
Использование слабого связывания паттерна DIдаёт ряд преимуществ, таких как: позднее связывание, расширяемость, параллельная разработка, удобство сопровождения, тестируемость[3], которые ценятся всегда.
Позднее связывание делает программу более гибкой и добавляет возможность заменять один сервис другим[6]. Для многих это является самым преобладающим преимуществом, но не стоит взвешивать все достоинства и недостатки, имея ввиду только его.
Возможность расширить, модифицировать программу также является залогом успешного программного обеспечения. Слабое связывание позволяет эффективно перестраивать приложение и вносить в него новые возможности[3].
Отсутствие сильной связанности позволяет использовать концепцию разделения, делающая возможным разработку параллельными командами[6], которая необходима при достижении проекта определённого размера.
Программу, написанную с использование паттерна DI очень легко сопровождать, потому что здесь используется принцип единственной ответственности (singleresponsibilityprinciple)[6], утверждающий, что каждый класс должен обладать только одной ответственностью. Теперь, зная кто за что отвечает, нам легко будет понять, где вести изменения, кого наказать при неисправности и так далее.
С тестированием все очевиднее. Слабое связывание по определению разрешает модульное тестирование.
И не нужно забывать про ASPECT.NET[5], который очень хорошо подходит для решения нашей задачи, так как IOC-контейнеры, являясь сквозной функциональностью, могут быть там очень удобно реализованы, либо вынесены.
1.4. Обзор данной работы
В следующих разделах рассматривается паттерн DI, в том числе программные продукты, реализующие его, и методы, благодаря которым зависимости внедряются в бизнес-логику проекта. Также будет говориться об IOC-контейнерах – библиотеках, отвечающих за инициализацию паттерна, и рассмотрены и сравнены различные существующие контейнеры различных компаний. В главе 3 рассматривается ASPECT.NET разработка кафедры информатики СПбГУ, с помощью которой и проводится «бесшовная» интеграция IOC и бизнес-логики.
В следующих главах рассматривается продукт под названием MSRoslyn, благодаря которому мы можем получить доступ к синтаксическому дереву и разобраться с семантикой любой бизнес-логики, включающей в себя инициализацию паттерна DI. Благодаря этому появляется возможность анализировать этот код, генерировать новый и позволить ASPECT.NETиспользуя эти данные автоматически распознавать искомую информацию об IOC-контейнерах и выносить её в аспекты.
В ходе выполнения данной работы были получены перечисленные ниже результаты:
• Изучена предметная область – принцип внедрения зависимостей, IOC-контейнеры и их реализации, MSRoslyn.
• Был произведен анализ контейнеров Unityи Ninject.
• Используя технологию Aspect.NET, IOC-контейнеры были вынесены в аспекты, тем самым целевой код полностью был избавлен от швов, причем результаты сборки не изменились.
• Используя MSRoslyn,была проведена работа по анализу кода и автоматическому поиску IOC-контейнеров в целевой программе
[1] Гамма Э., Хелм Р., Джонсон Р., Влиссидс Д. Приёмы объектно-ориентированного проектирования. Паттерны проектирования. Издательство «Питер». 1994
[2]Зотов М. Реализация надстройки MS VS 2012 для поддержки системы аспектно-ориентированного программирования Aspect.NET. СПИСОК-2014. Материалы Всероссийской научной конференции по проблемам информатики. Санкт-Петербург, 2014.
[3]Ларман К. Применение UMLи шаблонов проектирования. Второе издание. Издательский дом «Вильямс».2004
[4] Cафонов В. О. Аспектно-ориентированное программирование. Издательский дом Санкт-Петербургского государственного университета. 2011
[5] СафоновВ.О. Aspect.NET — a new approach to aspect-oriented programming // .NET Developers Journal. 2003.
[6]Симан М.Внедрение зависимостей в .NET. Издательство «Питер». 2013
[7]Laddad R. AspectJ in action. Practical aspect-oriented programming. Manning, 2003.
[8] Документация Microsoft: https://msdn.microsoft.com/library//Проверено 20.05.2017
[9] Сайт разработчиков Unity:https://msdn.microsoft.com/en-us/library/ff647202.aspx//Проверено 20.05.2017
[10] Сайт разработчиков Ninject:www.ninject.org///Проверено 20.05.2017
[11] Сайт разработчиков MEF:https://msdn.microsoft.com/en-us/magazine/gg650670.aspx//Проверено 20.05.2017
[12] Форум с обсуждениями контейнера Autofac:http://www.codeproject.com/Articles/25380/Dependency-Injection-with-Autofac//Проверено 20.05.2017
[13]Форум, посвященный DI-паттерну: http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison//Проверено 20.05.2017
[14] Форум, посвященный Spring.NET: http://www.springframework.net/doc-latest/reference/html/objects.html//Проверено 20.05.2017
[15] Мурадов М.: Личный блог: http://blog.muradovm.com/2012/01/blog-post.html//Проверено 20.05.2017
[16]Полухович А. Личный блог: http://sonyks2007.blogspot.ru//Проверено 20.05.2017
[17]Тепляков С. Личный блог: http://sergeyteplyakov.blogspot.ru//Проверено 20.05.2017
[18] Karen Ng.,Warren,MS., Peter Golde., Anders Hejlsberg. The Roslyn Project Exposing the C# and VB compiler’s code analysis. Microsoft Corporation. 2012
[19] Тепляков С. A simple analyzer using Roslyn. Личный блог: http://sergeyteplyakov.blogspot.ru//Проверено 20.05.2017