MEF II

Продолжаем разговор о MEF и сегодня на повестке дня небольшие дополнения о экспорте/импорте, время жизни дополнений, способы создания дополнений, наследование дополнений.

Экспорт/импорт по контракту

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

С помощью контрактов, можно назначать дополнения на конкретные, заранее определенные поля, без привлечения фильтров и воборок в ручную.

Итак, пусть у нас есть все те же два дополнения. Теперь только мы объявим контракты к ним. Это делается очень просто:

После это в мастер-приложении надо будет только указать поля, помеченные как импорт определенных контрактов.  Конечно про композицию не стоит забывать тоже.

Как видите, не надо теперь делать выборок по массиву загруженных дополнений. Они сами встали на свои места, как мы того ждем. В документации кажется приводятся примеры, когда можно не объявлять тип контракта, но тогда MEF не узнает, что чему сопоставлять. Выходом может стать тип dynamic.

 

Подробнее

SQL Change Master — II

Работа в консольном режиме

В режиме командной строки программа поддерживает на данный момент обновление баз для указанного окружения. При этом можно задать путь для записи логов и показ их по отработке выполнения.

Changecontroller.exe alias=dev log=”c:\temp\log.txt” showlog

Данная запись говорит, что надо найти и запустить обновление для окружения dev, лог выполнения записать в файл log.txt в папке c:\temp и после выполнения обновления показать лог. На мой взгляд, все достаточно просто и применимо в различных ситуациях, как для Continuous Integration, так и для работы в студии. Можно и просто вставлять в батнички для обновления многих настроек окружения.

Так же можно задать обновления определенной базы данных из указанного окружения.

Changecontroller.exe alias=dev base=testbasea

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

Если вы что-то указали неверно, или же программа не может найти указанное окружение или базу данных, то SQL Change Master запуститься в графическом режиме.

Работа в студии

Для того, чтобы настроить работу программу из студии, все равно нужен графический режим, где вы зададите все необходимые настройки по окружению и адреса до папок со скриптами. Только саму программу надо будет поместить недалеко от проекта, чтобы можно было указать относительный пункт до скриптов.

Итак, для работы нам понадобится SQL Change Master и датабазный проект от МS.

Настройка датабазного проекта

Создаем новый проект. File > New Project…

В появившемся окне выбираем шаблоны для баз данных для SQL Server и в них находим, к примеру, SQL Server 2008 Database Project.

Обратите внимание, что название проекта должно в точности совпадать с названием базы данных, которое было указано в SQL Change Master.

Подробнее

SQL Change Master — I

Из истории вопроса

Прежде чем приступить к описанию программы, я бы хотел осветить сам вопрос работы с базой данных по гибким методологиям. Или лучше сказать итеративное развитие базы данных, когда изменения в базу вносятся тогда, когда они нужны. Когда база развивается одновременно с приложением и, по сути, идет модель Code First, тогда база отвечает потребностям кода, а не код старается подстроиться под базу.

Я думаю, что для большинства, вполне очевидно, что модель хранения данных, и модель работы с данными, это две слабо пересекающиеся модели. Еще было бы замечательно поделить это все на модели/структуры для чтения и модели/структуры для  записи. Но это отдельная огромная тема, которую я не готов раскрыть.

Итак, в начальных условиях у нас в идеале новый проект, green field, или как минимум еще не выпущенный в релиз (разработчики любят начинать все с нуля). Но ничто по большому счету не мешает применить практики итеративного обновления данных и для выпущенного проекта. Если вы используете у себя итеративную поставку, то почему база должна отличаться?

На тему подходов к разработке БД и хранению ее скриптов в системе контроля версий сломано немало копий. Многие крупные разработчики предлагают свои решения, как программные, так и организаторского плана. Хороший обзор получился у  Outcoldman’а, описываются основные подходы к решению обновления БД и хранению истории с помощью проектов от Microsoft, Red Gate, еще каких-то разработчиков. Есть у всех свои слабые и сильные стороны. Я, так же как и Outcoldman, придерживаюсь мнения, что надо писать собственные скрипты обновления и использовать либо готовые решения, либо самому написать простейшие управляющие вещи, по выполнению этих скриптов.

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

  • Миграция данных
  • Переименование через drop\create
  • Атомарность обновлений
  • Однозначное определение текущего состояния базы

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

Подробнее

Создание nuspec файлов автоматически

В новой версии NuGet 1.3 можно создавать nuspec файлы автоматически. Ну или в полуавтоматическом режиме. Для этого можно будет сделать внешнюю команду в студии и использовать ее при необходимости создания пакетов NuGet. Сейчас я покажу как это делается, и что получается в итоге.

Для начала надо заполнить данные об авторе и компании в настройках проекта. Это можно сделать либо в ручную отредактировав файл AssemblyInfo.cs

 

Либо в настройках проекта на первой вкладке можно перейти на окошко Assembly Info и там заполнить необходимые поля.

Это важно, так как информация о пакете будет браться оттуда. Пока что концепция NuGet не может быть полностью отображена с помощью файла AssemblyInfo, так что файл nuspec нужен до сих пор. Ну да это не беда, уже не надо его писать руками полностью.

Файл спецификации nuspec создается с помощью команды spec. При этом рабочая директория должна быть та, где лежит файл проекта.

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

После того, как завершите настройку nuget, как инструмента создания nuspec файлов, можно использовать его. Выбираем проект, который будет оформлен в виде Nuget пакета, Tools > Generate NuSpec и получаем нужный нам файл.

Подробнее

MEF

Сегодня я хочу рассказать о системе постороения динамического, модульного приложения с использованием Managed Extensibility Framework (MEF).  Вообще это уже достаточно старая технология, которая вылилась из системы Add-On от компании Микрософт. МEF стала дружелюбной оболочкой над монструозной системой предложенной ранее. Результат оказался настолько хорош, что MEF включили в поставку .Net Framework 4 по умолчанию, так что не потребуется искать и загружать библиотеки отдельно, беспокоится, есть ли данная библиотека у пользователя.

Так же уже понятно, что данную технологию можно использовать в Enterprise разработке, так как она в основной поставке фреймворка, а это такой аргумент, против которого менеджеры проектов не попрут. Обычно, менеджеры проектов очень неохотно идут на использование технологий и продуктов которые не упомянуты в пресс-релизах MS, даже если данная технология широко и успешно используется сообществом. Хотя их можно понять, это будет первый пункт, по которому их будут пинать в случае любых накладок.

Итак, MEF легко позволяет сделать приложение модульным, и подключение новых библиотек может быть осуществленно на лету, без использования сложных приемов. Весь код остается прозрачным и легким для понимания.

 

MEF можно использовать начиная с версии .Net 3.5, взяв необходимые библиотеки с CodePlex. Как вы уже догадались, оттуда же можно взять исходный код и посмотреть как все это работает.

Основные возможности MEF:

  • Предоставляет стандартизированный способ для организации мастер-приложения и для дополнений к нему. В общем случае дополнения не привязаны к конкретному приложению и при реализации общего интерфейса могут быть использованы разными программами, что в целом не отменяет и жесткой привязки к мастер-приложения. Дополнения могут быть зависимы друг от друга и MEF самостоятельно подключит их в нужном порядке.
  • Предоставляет возможности поиска и загрузки дополнений силами самого MEF
  • Позволяет помечать дополнения метаданными, для дополнительных возможностей по подключению и фильтрации дополнений.

Подробнее

NuGet 1.3

Недавно вышла новая версия NuGet и я хотел бы освятить новые возможности, которые в нем появились. Сначала кратенько о том, что нового, потом подробнее рассмотрим изменения в привычных техниках работы.

Интеграция с symbol server

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

Новая команда Open-PackagePage

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

Общий синтаксис команды такой:

Open-PackagePage -Id <string> [-Version] [-Source] [-License] [-ReportAbuse] [-PassThru]

Последний параметр используется для того, чтобы получить URL страницы пакета в ответ, не открывая браузера.

Далее

 

Подробнее

Запуск .bat из Visual Studio 2010

Или как навесить произвольное действие к контексту к любому элементу в обозревателе проектов.

Как уже было сказано в заголовке, данное действие мы будем проворачивать для .bat файлов, так как они широко используются в нашей повседневной деятельности и постоянно открывать проводник или FAR не очень удобно. Гораздо лучше сделать свое действие и до кучи повесить на него сочетание клавиш, для достижения полной нирваны.

Итак, дано: проект, в котором используются батники.

Требуется: запускать батники из контекстного меню в обозревателе проектов.

Подробнее