Visual Studio. Заготовки проектов
В последнее время я не просто много, а очень много экспериментирую с кодом, подходами, написаниями каких-то тестовых сценариев и приложений. Результат, конечно, всегда разный, ну да не об этом сегодня пойдет речь. Постепенно начинаешь уставать от настройки стандартных проектов. Для проекта библиотек надо удалить класс, создаваемый там по умолчанию, потому что все равно его будет лень переименовывать. Мне приятно еще перенаправлять весь вывод компиляции в одну папку в корне всего проекта из всех библиотек, а не шариться по папкам ..\bin\Debug\ для каждого составляющего проекта, выгребать оттуда *.dll. Для проектов Test удаление ненужного барахла особенно актуально! Было бы неплохо еще сразу настроить атрибуты для сборки и информацию о ней (Assembly). Ко всему
Хочу, чтобы при создании чего-то нового, выбрал проект – и все у тебя настроено! И общая папка вывода, и нужные значения в AssemblyInfo прописаны, и лишнего ничего не валяется в проекте. Подумал я так и вспомнил, что есть у студии опция «Get online Templates», а раз есть онлайн, то должна быть и оффлайн – для моих собственных шаблонов. Сказано сделано!
В результате я очень доволен, что потратил час времени для настройки всех нужных мне проектов и теперь не отвлекаюсь в процессе, а только радуюсь, как все здорово вышло и что не надо тратить время на тупую работу.
О том, как это сделать в Visual Studio 2008, 2010 и пойдет речь дальше. Так же будет рассмотрено, как удалять, и импортировать готовые шаблоны проектов в студию.
PostSharp. Безопасность полей класса
И снова речь пойдет о PostSharp! =) Сегодня я хочу рассказать об аспекте OnFieldAccess (или в версии 2.0 LocationInterceptionAspect), который позволяет держать контроль над использованием свойств и полей класса. В прошлых статьях я рассказывал о применении аспектов на вызовы методов и о задачах, которые могут быть решены с их помощью. В целом, все те же задачи применимы и к полям: логирование изменения значений полей, защита доступа по ролям. Кроме этого можно организовать защиту полей от записи, декларативную проверку значений, уведомление других объектов об изменении значений.
Многие эти задачи при реализации традиционным способом, порождают необходимость написания кучи однородного кода. PostSharp позволяет избавиться от размазывания кода по всем слоям и консолидирует все проверки в одном месте, что, на мой взгляд, легче для понимания и дальнейшего внесения изменений.
Так же, в этой статье я рассмотрю такую возможность PostSharp, как проверка возможности применения аспекта на этапе компиляции. Я считаю, что это замечательная возможность, которой не стоит пренебрегать в дальнейшем. Для кого-то это может даже стать решающим моментом в применении данного продукта. Я знаю таких людей, которые ни за что не будут пользоваться продуктом, который не будет их строго ограничивать, а тут они имеют возможность написать себе такие ограничения и радоваться жизни. Да и в случае дистрибуции третьим сторонам вашей библиотеки это будет полезно.
PostSharp. Безопасность
Продолжаем подробный разговор о аспекте OnMethodBoundary. Данный аспект применяется, когда у вас есть доступ к исходным кодам метода и вы хотите отслеживать события начала вызова метода, конец вызова, исключение и успешность завершения. Все это делается переопределением методов OnEntry, OnExit, OnException и OnSuccess соответственно.
Применение аспекта OnMethodBoundary рассмотрим на примере задач о разрешении или запрещении тех или иных действий, логирование интересующих нас действий, генерация служебного кода. Так же с помощью данного аспекта можно декларативно указывать запускать ли методы в отдельном потоке или нет, но это рассмотрим подробно и в деталях в другой статье. Сегодня на повестке дня безопасность – это будет показано в одном приложении, исходный код которого можно свободно скачать и поиграться с ним.
Security
При создании более-менее сложных программных продуктов, часто требуется определять несколько ролей для работы с программой. В самом минимальном случае это администратор и пользователь. Для такого набора ролей можно как-то вывернутся по-простому, например, разграничить экраны для этих ролей, может даже каким-то образом сервисы. Но это не избавит от ошибок использования методов. При развитии программы могут появляться новые роли, менятся ответственность старых, и тогда придется отслеживать какой метод доступен для какой роли. В коде это должно превратиться в сущий ад и добавление новой роли или изменение ответственности будет не самой приятной задачей. К тому же вероятность ошибки все равно будет велика. Лучше определять роли доступа декларативно, таким образом будет легче управлять правами и сразу видно, что кому доступно. Легко вносить изменения и добавлять новые роли. Но обо всем по порядку.
PostSharp. Логирование
Продолжаем подробный разговор о аспекте OnMethodBoundary. Данный аспект применяется, когда у вас есть доступ к исходным кодам метода и вы хотите отслеживать события начала вызова метода, конец вызова, исключение и успешность завершения. Все это делается переопределением методов OnEntry, OnExit, OnException и OnSuccess соответственно.
Применение аспекта OnMethodBoundary рассмотрим на примере задач о разрешении или запрещении тех или иных действий, логирование интересующих нас действий, генерация служебного кода. Так же с помощью данного аспекта можно декларативно указывать запускать ли методы в отдельном потоке или нет, но это рассмотрим подробно и в деталях в другой статье. Сегодня на повестке дня логирование – это будет показано в одном приложении, исходный код которого можно свободно скачать и поиграться с ним.
Logging
Полезная функция, которая в состоянии подсказать где происходит ошибка и с каким набором данных, подсказать какие функции наиболее востребованы пользователями. Да мало ли еще какое применение можно найти для собранной детальной информации! =)
Будем основываться на приложении из прошлой статьи. У нас готов интерфейс для отображения происходящего в системе. Так что можно начинать.
PostSharp. Генерация кода
Сегодня я хочу остановиться поподробнее на аспекте OnMethodBoundary. Данный аспект применяется, когда у вас есть доступ к исходным кодам метода и вы хотите отслеживать события начала вызова метода, конец вызова, исключение и успешность завершения. Все это делается переопределением методов OnEntry, OnExit, OnException и OnSuccess соответственно.
Применение аспекта OnMethodBoundary рассмотрим на примере задач о разрешении или запрещении тех или иных действий, логирование интересующих нас действий, генерация служебного кода. Так же с помощью данного аспекта можно декларативно указывать запускать ли методы в отдельном потоке или нет, но это рассмотрим подробно и в деталях в другой статье. Сегодня на повестке дня безопасность, логирование и генерация кода – все это будет показано в одном приложении, исходный код которого можно свободно скачать и поиграться с ним.
Code Generation
На мой взгляд, больше всего «бесполезного» кода появляется на пользовательских формах и представлениях (UserControl) для WinForms. Необходимо подписывать почти каждый элемент на событие щелчка, изменения состояния элемента. Это куча кода, которую можно не писать совсем в большинстве случаев, если принять некоторые соглашения и строить весь интерфейс на биндинге. В конечном итоге такая практика поможет лучше понять идеологию WPF, если вы еще не перешли на нее. Да и поддерживать и тестировать такое подход, на мой взгляд, легче.
PostSharp. Альтернативы
Я тут подумал, что несправедливо было бы обойти стороной сравнение PostSharp и других продуктов предоставляющих АОП. Ниже будут рассмотрены особенности использования, плюсы и минусы различных подходов. Но не думайте что PostSharp является серебрянной пулей. =)
Можно почитать и википедию насчет АОП и фреймворков для .Net платформы. Я посмотрел несколько перечисленных там фреймворков лично и по документированности и простоте использования остановился на PostSharp.
Containers (Инверсия зависимостей)
Большинство фреймворков направленных на инверсию зависимостей включают в себя некоторые возможности аспектно-ориентированного программирования. Для большинства достаточно простых технических требований, таких как трейсинг и обработка исключений применяемых к сервисам приложения, их возможностей хватает. Но их нельзя применить для более сложных и комплексных аспектов, которые могут применяться так же к объектам пользовательского интерфейса или к доменным объектам.
Продукты: Spring.NET, Castle Windsor, Microsoft Unity
Плюсы:
- Вы уже используете фреймворк для инверсии зависимостей
- Аспекты могут быть настроены после сборки
- Некоторые аспекты (трейсинг и обработка исключений) могут быть уже реализованы в вашем фреймворке.
Минусы:
- Очень ограниченные возможности в плане АОП
- Ваши объекты должны создаваться с помощью контейнера предоставляемого фреймворком. Такой способ нельзя применить для элементов пользовательского интерфейса, и во многих случаях для доменных объектов тоже.
- Не работает со статическими, не публичными и/или не виртуальными методами. Так же не будет работать применение на поля, свойства и события классов.
- Нет, или же плохое инструментирование для Visual Studio
PostSharp. Обзор. Часть I
Прежде чем перейти непосредственно к теме повествования, необходимо сказать несколько слов о системных вещах.
Аспектно-Ориентированное программирование
Аспектно-ориентированное программирование (АОП) — парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули.
Существует достаточно много классов задач, решение которых невозможно в контексте ООП или же приведет к большой захламленности кода и связности модулей, что плохо. Например, логирование. Для того чтобы вести лог работы программы, необходимо в каждый метод поместить несколько служебных строчек вызова службы логирования, так же возможно придется ее передавать через входные параметры методов. Весь этот код не будет относиться к выполнению реальной задачи возложенной на метод, а только мозолить глаза. К тому же, сколько лишних строчек кода придется написать вручную!
Еще примером может служить авторизация и проверка прав доступа. По-хорошему, перед началом выполнения важных методов, надо каждый раз проверять, имеет ли текущий пользователь права на запуск указанного метода. Тут тоже может быть очень много мороки и кода.
В целом, любой сквозной код выпадает из возможностей ООП. АОП программирование, наоборот, предоставляет все средства для выделения «сквозного кода» в отдельные сущности, что существенно упрощает код как для тестирования, так и для использования.
Offtopic
Траляля, с Днем Рождения меня!
Чтобы было много сил для изучения новых технологий и написания статей! Чтобы были новые цели и силы для их достижения, чтобы все задуманное достигалось =)
Assembla. Совместная работа.
Набор команды
Допустим у вас уже есть проектное пространство на портале Assembla и вы решили пригласить товарища(ей) поучаствовать в вашем проекте. Нет ничего проще добавления их в проект!
Для этого идем на вкладку «Team», где можно пригласить товарищей по их нику в Assembla или по почтовому адресу.
На этом же экране будет отображаться вся ваша команда.
Assembla. Обзор
Данный обзор не технический и не рекламная акция в пользу Assembla. Я лишь хочу поделиться опытом использования этого ресурса, насколько все просто и легко все организованно.
Как я дошел до этого ресурса
Когда я более-менее стал писать программы, возникло желание делать это при любой возможности. Дома со стационарного компьютера, с ноутбука, с рабочего, да в целом с любого компьютера, где стоял подходящий IDE(Integrated Development Environment). Но тут возникает несколько проблем:
- Как вести работу с последней версией кода
- Как это потом синхронизировать с остальными компьютерами
Первая проблема удручала меня в особенности. Так как когда выдавалась свободная минута на работе, или я хотел поработать с ноутбука, мне приходилось либо доставать версию с флешки, либо заниматься другим проектом. Если вдруг оказывалось, что я все же не забыл флешку и код, то возникала проблема номер два: как мне все это совместить и синхронизировать с остальными версиями проекта на других компьютерах.
Я тогда еще много не знал, и мне казалось сказкой такая возможность. Т.е. я конечно о таком мечтал, но не очень знал с какой стороны к этому подойти.
В какой-то момент в любой ситуации и области знаний возникает переломный момент, после которого все разрозненные кусочки знаний складываются в единое целое. Я уже знал о динозавре Visual Source Safe (экспериментировал дома с доступами и все такое), пользовался активно Team Foundation Server на работе. Но надо было что-то такое, что было бы доступно отовсюду. Хотел было организовать себе статический IP адрес, но для физических лиц такой услуги у провайдера не было. И в этот момент, о чудо, попадается на глаза статья о сетевых сервисах предоставляющих системы контроля версий бесплатно, т.е. на халяву! Я уже не помню, какие системы были перечислены в той статье, но Assembla чем-то меня зацепила. Около полутора лет я пользуюсь этой системой и впечатления самые радужные. Далее (в этом и других ) я расскажу об основных возможностях системы, таких как:
- Git, SVN репозитории;
- Система управления требованиями;
- Совместная работа над проектом;
(Много скриншотов)
