<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2367164845432236329</id><updated>2011-04-21T16:15:02.745-07:00</updated><title type='text'>Let's do some .NET</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dotnetpart.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2367164845432236329/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dotnetpart.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Александр Ефимов.</name><uri>http://www.blogger.com/profile/17204054245182445127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2367164845432236329.post-5899666405503961830</id><published>2009-03-17T12:16:00.001-07:00</published><updated>2009-03-17T12:16:28.627-07:00</updated><title type='text'>System.Addin или «Игры с надёжными плагинами». Часть 1.</title><content type='html'>&lt;b&gt;Введение.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    Доброго времени суток. Я думаю, что абсолютное большинство из вас сталкивалось с проблемой расширяемости приложений. Точно также я думаю, что многим из вас приходилось копать Reflection для выяснения того, является ли сборка плагином к вашей программе. Многим не нравилось то, что в .NET сборки по умолчанию загружаются в один домен с приложением, а затем их нельзя было выгрузить. Многие, конечно, создавали объекты в отдельных доменах через CreateInstanceAndUnwrap, но всё это приходилось делать руками. В общем «мыши плакали и кололись…».  С появлением System.Addin разработчики получили в свои руки инструмент для создания расширяемого приложения, который лишён этих проблем, что называется, «из коробки». Об этой технологии я и расскажу в нескольких статьях.&lt;br /&gt;&lt;br /&gt;Прежде, чем начать – разберёмся с терминологией:&lt;br /&gt;&lt;strong&gt;Хост, Хост-приложение&lt;/strong&gt; – это, собственно, расширяемое приложение, которое, как правило, производит поиск и активацию расширений.&lt;br /&gt;&lt;strong&gt;Addin, Расширение&lt;/strong&gt; – это модуль, который содержит какой-либо дополнительный функционал для хост-приложения&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Возможности System.Addin&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;    Что же такое System.Addin? Это новое пространство имён(namespace), которое появилось в .NET Framework 3.5. По сути своей System.Addin предоставляет разработчикам программную модель для расширения функционала приложения. Причём применение этой программной модели даёт несколько ключевых возможностей:&lt;br /&gt;&lt;br /&gt;    1.  Хост-приложение и Addin могут иметь независимые версии. Таким образом можно построить хост-приложение,которое бы работало и со сборками расширения, которые были построены для предыдущих версий приложения, либо для более поздних версий приложения, либо которые вообще были построены для другого приложения.&lt;br /&gt;   &lt;br /&gt;    2.    Возможность активировать Addin с нужным уровнем изоляции и правами безопасности. То есть программная модель System.Addin позволяет позаботиться о безопасности приложения даже если Addin был создан сторонними разработчиками. Теперь никакой бажный модуль расширения не завалит вашу программу.&lt;br /&gt;&lt;br /&gt;    3.    Поддержка нескольких уровней изоляции расширения от хост-приложения и других расширений. То есть существует несколько возможных сценариев построения изоляции на уровне доменов или процессов, за счёт чего усиливается безопасность хост-приложения.&lt;br /&gt;&lt;br /&gt;    4.    Более удобное управление жизнью расширения. Так как используется изоляция на уровне доменов или процессов, то по завершению работы с плагином достаточно просто выгрузить нужный домен.&lt;br /&gt;&lt;br /&gt;Окей. С некоторыми возможностями разобрались. Идём дальше.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Архитектура&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;    Вся архитектура System.Addin строится вокруг такого ключевого понятия, как &lt;i&gt;Add-in pipeline&lt;/i&gt;(Я бы перевёл как «конвейер расширений»). Под этим словосочетанием по сути всё и скрывается. Смотрим следующий рисунок, всё с архитектурой проясняющий:&lt;br /&gt;&lt;br /&gt;  &lt;img align="center" src="http://pic.ipicture.ru/uploads/090312/36MLu3SVQe.jpg" alt="image" /&gt;&lt;br /&gt;&lt;br /&gt;    Это - тот самый &lt;i&gt;Add-in pipeline&lt;/i&gt;. За счёт всех этих сегментов в пайплайне и достигается необходимый уровень абстракции и обеспечивается изоляция. Разберём поподробнее. На концах конвейера видим Хост-приложение и само расширение. Это не самые интересные вещи, поэтому сразу перейдём к рассмотрению того, что находится между ними:&lt;br /&gt;&lt;br /&gt;    1.    &lt;i&gt;Контракт&lt;/i&gt;. Как видно из рисунка, контракт представляет собой интерфейс, «протокол взаимодействия» хоста и расширения, и является точкой их соприкосновения.&lt;br /&gt;&lt;br /&gt;    2.    Далее по обе стороны контракта создаются &lt;i&gt;адаптеры&lt;/i&gt; (наследуют Views), которые реализуют соответствующие &lt;i&gt;классы представления(views)&lt;/i&gt; и оборачивают контракт интерфейсом, который предоставляет view. Также, если вы не объединяете одной сборкой Addin view и Host view, вы можете объединить Host и Host view в одну сборку. В любом случае мой вам совет: используйте отдельную сборку для каждого сегмента конвейера. Так будет проще.&lt;br /&gt;&lt;br /&gt;    3.    Ну и третьим пунктом идут &lt;i&gt;классы-представления&lt;/i&gt; (строго должны быть интерфейсами, либо наследуемыми классами). Они являются соответствующими представлениями типов и методов, которые используются при взаимодействии хоста и расширения.&lt;br /&gt;&lt;br /&gt;    На данном этапе этой информации нам хватит. Достаточно просто представлять себе как выглядит Add-in pipeline. Более подробно роль каждого из сегментов этого конвейера мы рассмотрим в одной из следующих статей.&lt;br /&gt;Стоит также отметить, что архитектура накладывает некоторые ограничения, с которыми мы сталкиваемся в процессе создания:&lt;br /&gt;   &lt;br /&gt;    1.    Во-первых, каждый сегмент из конвейера в идеале представляет собой отдельную сборку. Представления можно объединить в одну сборку, но только при условии такого же объединения адаптеров.&lt;br /&gt;   &lt;br /&gt;    2.    Во-вторых, Addin-ы, адаптеры и контракты должны быть публичны и помечены специальными атрибутами. См. рисунок ниже:&lt;br /&gt;&lt;img align="center" src="http://pic.ipicture.ru/uploads/090312/9rYEou9766.jpg" alt="image" /&gt;&lt;br /&gt;&lt;br /&gt;    Квадратными скобками помечены обязательные атрибуты. Как можно заметить представление со стороны хоста не требует специального атрибута.&lt;br /&gt;&lt;br /&gt;    3.    В-третьих, требуется соблюдение жёсткой структуры папок, которая должна строго соблюдаться для нормального функционирования конвейера:&lt;br /&gt;&lt;br /&gt;&lt;img align="center" src="http://pic.ipicture.ru/uploads/090312/Povh80133K.jpg" alt="image" /&gt;&lt;br /&gt;&lt;br /&gt;*&lt;i&gt;Addin-ы не обязательно лежат рядом с адаптерами, представлениями и контрактами. Расширения могут распологаться где угодно.&lt;/i&gt;&lt;br /&gt;Можно заметить, что каждый сегмент конвейера должен быть расположен в своей собственной папке, причём папки AddInSideAdapters, AddInViews, Contracts и HostSideAdapters не допускают наличия в них вложенных директорий.&lt;br /&gt;&lt;br /&gt;    4.    В-четвёртых, так как наиболее типичным является сценарий с активацией расширения в отдельном домене, то при проектировании не стоит забывать о том, что пересекающие границы доменов(в качестве параметров или возвращаемых значений) объекты должны быть сериализуемы.&lt;br /&gt;&lt;br /&gt;Вот так. Ни больше, ни меньше.  Архитектура и накладываемые ограничения могут на первый взгляд показаться излишне сложными, но в реальности это не так. Я думаю, что теперь многие из вас представляют себе, что же такое System.Addin&lt;br /&gt;На этом всё.&lt;br /&gt;&lt;br /&gt;В следующей статье я покажу пример, демонстрирующий применение System.Addin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2367164845432236329-5899666405503961830?l=dotnetpart.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetpart.blogspot.com/feeds/5899666405503961830/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dotnetpart.blogspot.com/2009/03/systemaddin-1.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2367164845432236329/posts/default/5899666405503961830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2367164845432236329/posts/default/5899666405503961830'/><link rel='alternate' type='text/html' href='http://dotnetpart.blogspot.com/2009/03/systemaddin-1.html' title='System.Addin или «Игры с надёжными плагинами». Часть 1.'/><author><name>Александр Ефимов.</name><uri>http://www.blogger.com/profile/17204054245182445127</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
