73
Декабрь 2011 №12 (04) Разработчикам про технологии Microsoft Дмитрий Андреев эксперт по разработке информационных систем Microsoft Юлия Белянина MVP Lead Russia & CIS Мария Хрузина Microsoft Student Partner Интервью

12 (04) MSDeveloperRU

Embed Size (px)

DESCRIPTION

Декабрьский номер журнала MSDeveloper.RU

Citation preview

Page 1: 12 (04) MSDeveloperRU

Декабрь 2011 №12 (04)

Разработчикам про технологии Microsoft

Дмитрий Андреевэксперт по разработке информационных системMicrosoft

Юлия БелянинаMVP Lead Russia & CIS

Мария ХрузинаMicrosoft Student Partner

Интервью

Page 2: 12 (04) MSDeveloperRU

Рекл

ама

Page 3: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 03

К олонка главного редактора Станислав Горнаков

Хотите быть в курсе всех событий?Подпишитесь на нашу RSS-ленту новостей, Twitter, ВКонтакте

или страницу в Facebook.Мы вещаем круглые сутки семь дней в неделю

Свежие новости в Twitter'e

RSS-лента новостей

Свежие новости в Facebook'e

Свежие новости в ВКонтактe

Приветствую!

Вот и подошел к своей завершающей стадии этот счастливый 2011 год. Вы спросите, чем же он такой счастливый? Уверен, у каждого в этом году были свои радостные моменты, которые запомнились нам по-особенному. Например, многие студенты стали новыми MSP (@KuranovaYana, @it_bel4onok), другие из MSP подросли до MVP (@xelikk, @trukhin-yuri), некоторые устроились работать в Micro- soft (@XaocCPS), кто-то, работая в Microsoft, сотворил и провел потрясающий «День сту-дента» (@shwars) и конференцию Tech Ed 2011 Россия (@vladkol), а у кого-то родилась дочка (@dmandreev)!

А возьмем в пример журнал MSDeveloper.RU, который вы сейчас надеюсь, с удовольстви-ем читаете. Друзья, это ли не счастье? на просторах Интернета появился бесплатный, не побоюсь этого слова, качественный и классный журнал для разработчиков, ра-ботающих с продуктами и технологиями Microsoft. Теперь каждый русскоязычный разработчик может опубликовать свою ста-тью в MSDeveloper.RU и быть услышан и оценен профессионалами своего дела. Сколько новых авторов и интересных статей мы уже успели напечатать в этих четырех номерах журнала. Все это и есть те самые радостные моменты, делающие этот год счастливым и особенным для каждого из нас!

От себя лично и от лица всего дружного кол-лектива журнала MSDeveloper.RU, хочу по-здравить Вас с наступающим Новым 2012 годом и пожелать вам, чтобы все то, что вы задумали в своей работе и повседневной жизни, обязательно сбылось. Верьте в себя, будьте дружными с коллегами и друзьями, не болейте и любите своих ближних. Коли-чество Новых годов для всех нас строго ли-митировано, поэтому делайте задуманное сейчас!

Page 4: 12 (04) MSDeveloperRU

Гикам и разработчикам

Журнал выходит ежемесячно и распространяется бесплатно

Издательская группаООО «Издательство «Стангор»www.stangor.ruЖурнал MSDeveloper.RUwww.msdeveloper.ru

Издатель и руководитель проектаСтанислав Горнаков [email protected]

Зам. главного редактораИгорь Редько [email protected]

Арт-директорСветлана Петрова [email protected]

РедакторыСергей РубанИрина ВойковаАндрей КовальВасилий СенявскийМарат ЯгудинИгорь ВойковИгорь Периодов

КорректорыКсения РубоваМаксим ВеровРоман ВетринМаксим Злобин

АвторыАндрей ГордиенковВалерий ВоробьевБорис РомановСергей КарташевАндрей ТарицынМария ЧерныхЯна КурановаАндрей МоорМихаил ГалушкоСтанислав Горнаков

Отдел маркетинга и рекламы

Руководитель отделаВиктор Прудников [email protected]

Реклама в журнале[email protected]

Реклама на сайте журнала[email protected]

Издание зарегистрировано в Комитете Российской Федерации по ПечатиСвидетельство № ФС 77 - 3905

Журнал издает ООО «Издательство «Стангор»

Для пресс-релизов и информации о пресс-конференциях[email protected]

Авторамwww.msdeveloper.ru/about/autors.aspx

За достоверность рекламной информации ответственность несут рекламодатели. Ре-кламные материалы не редактируются и не корректируются. Редакция ждет ваших откликов и писем читателей. Фотографии, рукописи и другие печатные материалы нередактируются и не корректируются. При цитировании или перепечатывании мате-риалов ссылка на сайт www.msdeveloper.ru и название журнала MSDeveloper.RU обязательна. Полное или частичное вос-произведение материала журналов воз-можно только с письменного разрешения Издательства Стангор. Мнение редакции журнала может не совпадать с мнением авторов статей публикуемых в журнале. Все товарные знаки принадлежат их вла-дельцам.

© ООО «Издательство «Стангор»© MSDeveloper.RU

Декабрь 2011 №12 (04)

И нтервьюИнтервью с Дмитрием АндреевымЭкспертом по разработке информационных систем

Интервью с Юлией БелянинойMVP Lead Russia & CIS

Интервью с Марией ХрузинойMicrosoft Student Partner

. N ET FrameworkПрактическое использование событий на слабых ссылках для уведомлений об изменениях

11

34

52

23

Р епортаж

Фоторепортаж День Microsoft в Астрахани 07

16

W indows Presentation FoundationClickOnce, WPF, MSBuild и несколько окружений

28

31

W indows AzureРазвертывание приложения Windows Azure средствами Visual Studio 2010

Жизненный цикл проекта Windows Azure при старте

Page 5: 12 (04) MSDeveloperRU

6771

Р азработка

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

Облегчаем работу с JS- и CSS-кодом в Visual Studio

W indows Phone 7Хранение данных в Windows Phone

Аппаратная начинка Windows Phone 7

3844

А SP.NETTelerik Extensions для ASP.NET MVC Q3 2011 56

S ilverlightОбзор Devexpress 59

. N ET1C.Net:Предприятие использование диаграмм .Net Framework 4 на веб-страницах и 1С:Предприятие 8.2

46

Page 6: 12 (04) MSDeveloperRU

Рекл

ама

Page 7: 12 (04) MSDeveloperRU

Фоторепортаж

Фоторепортаж День Microsoft в Астрахани

АвторЯна Куранова Microsoft Student [email protected]

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

прошло такое интересное и красочное мероприятие. Сразу очень хочется поблагодарить Дмитрия Андреева, Александра Морозова, Петра Савченко за интересные доклады, за помощь, а так же всех, кто принял участие в организации данного мероприятия!

Мы собрали в нашем зале 150 талантливых и любознатель-ных молодых людей.

Как всем известно, люди, работающие в IT-сфере, не только очень сообразительные, но очень креативные и творческие личности – наши ребята не исключение. Поэтому мы устроили два конкурса: конкурс стихов о компании Microsoft, а так же конкурс на лучшие рисунки.

1

2

Page 8: 12 (04) MSDeveloperRU

Фоторепортаж

На мероприятии у нас было много разных стендов, один из которых был посвящен игровой консоли Xbox 360 и Kinect. Как только Дмитрий Андреев (Евангелист Microsoft) установил Xbox 360 и Kinect, сразу набежало много людей. Всем хотелось попробовать, пощупать и понять, как это работает. Я видела счастливые лица игроков, во время их танцев, и одновременно опечален-ные, когда место приходилось уступать кому-то другому.

Одним из знаменательных событий года является старт продаж телефонов на базе Windows Phone 7. Мы не могли не продемонстрировать все пре-имущества данной платформы, поэтому у нас был отдельный стенд по платформе WP7. Спасибо Елене Буряковой за помощь в организации стенда. Возможности Windows Phone 7 мы показали на телефоне HTC Mozart. Честно скажу, что когда бы ни проходила около этого стенда, там всегда было многолюдно.

Еще один продукт, который мы смогли показать на стендах – это операционная система Win-dows 7. Так же гости смогли получить инфор-мацию о таком бесплатном и очень удобном компоненте, как Windows Live.

Спасибо за помощь в организации стенда о Windows Live Ольге Середенковой.

Далее по времени был запланирован пленарный доклад. Открыла День Microsoft директор института информационных технологий АГТУ И. Ю. Квятковская. В этом докладе студенты узнали о програм-мах, которые предоставляет компания: DreamSpark, BizSpark, MSDN AA.

3

4

5 6

7

Page 9: 12 (04) MSDeveloperRU

Фоторепортаж

Дмитрий Андреев рассказал об учебных ресурсах и всем известном конкурсе Imagine Cup.

Зал был полон, все внимательно слушали до-клады.

В одной из аудиторий я и Дмитрий Андреев очаровывали студентов новыми функциями в Windows 7 и MS Office 2010.

Александр Морозов поведал нам о том, как стать сертифицированным специалистом. Главным достоин-ством в сертификации студенты сочли прибавку к заработной плате.

Я и Петр Савченко рассказали о программе Microsoft Student Partner и своем впечатле-нии от участия.

8

9

10

1112

Page 10: 12 (04) MSDeveloperRU

Фоторепортаж

Аудитория, вид сверху.

В другой аудитории Александр Морозов и Петр Сав-ченко завораживали гостей докладами о 3D играх и о создании сайтов с помощью Web-Matrix.

Некоторые студенты не пошли на доклады, а сто-яли у стендов с Xbox и c Windows Phone 7. Да-да, стенды работали и во время докладов.

Дмитрий Андреев демонстрирует интересные «фишки» Windows 7 и MS Office 2010.

Петр Савченко о Web-Matrix.

13

14

1516

17

Page 11: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 11

И нтервью

Интервью с Дмитрием Андреевымэкспертом по разработке информационных системкомпании Microsoft

Беседовал Станислав Горнаков

Наше досье

?

В 1996 году окончил обучение в Таганрогском Радиотехническом Универси-тете

С 1996 по 2000 год работал в РАО «Газпром»

С 2001 по 2004 год работал в ООО «ТопС Бизнес Интегратор»

С 2004 года по настоящее время работает в компании Microsoft

Станислав Горнаков: Дми-трий здравствуйте! Спа-сибо что согласились дать интервью нашему журналу! Насколько я знаю, вы уже давно работаете в Microsoft. Расскажите, как вы получи-ли возможность работать в этой компании?

Дмитрий Андреев: Признаться чест-но, работать в Microsoft я мечтал с тех самых пор как начал изучать техноло-гии этой компании. Но одно дело меч-тать, а другое дело каким-то образом двигаться к этой цели. С 2001 года я работал в крупном Российском инте-граторе, руководителем группы при-кладных решений на базе технологий Microsoft. Посещал семинары и конфе- ренции, проводимые Российским пред-ставительством, познакомился с мас-сой замечательных людей. Появлялись совместные проекты. И в 2003 году мне позвонили из кадрового агентства, сказав по секрету, что «вашей канди-датурой интересуется крупная запад-ная компания». Само трудоустройство заняло очень долгое время, я прошел за полгода пять или даже шесть интер-вью. В один момент мне даже показа-лось что все, шанс упущен. Тогда в Рос-сийском представительстве работало очень небольшое количество людей, в основном в подразделениях связанных

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

Но сейчас вы работаете на другой позиции и в другом подразделении?

Да, с 2004 по 2007 год я работал кон-сультантом. За это время был реали-зован не один десяток проектов, в ко-торых я участвовал. В том числе это были крупные внедрения SharePoint Server и Project Server. До сих пор зна-ния и навыки, которые были приоб-ретены, являются фундаментом для многих вещей, которыми приходится заниматься сейчас. В первую очередь это проектная и процессная организа-ция, подходы по реализации программ-ных проектов.

В 2005 году вышла в свет первая версия Team Foundation Server – инструмента организации командной работы. У меня был очень большой интерес к этому комплексу, я повышал свою экспертизу в области организации процессов раз-работки, проводил семинары по вне-дрению TFS. И в 2007 году перешел на

позицию Эксперта по Архитектуре ин-формационных систем в департамент стратегических технологий. На англий-ском языке наше подразделение на-зывается Developer and Platform Evan- gelism, и моя должность соответствен-но Evangelist.

Чем вам приходится за-ниматься сейчас? Каков технологический интерес?

Чтобы ответить на этот вопрос следует разделить два важных момента, кото-рые есть в нашей работе. В Microsoft принята культура четкого «целепола-гания», которое можно выразить через метрики. Например – нам надо чтобы за год было проведено столько-то меро-приятий, было подготовлено столько-то статей и вебкастов, их посмотрело столько-то людей. Это напрямую вли-яет на другие наши цели, как к нам, как вендору, относятся программисты. Все это тоже измеримые показатели. Достижение этих целей, а точнее целе-вых значений – это проекты, в которые вовлечены все сотрудники нашего под-разделения, а часто и других отделов. Эти проекты уже детализованы до того уровня, который позволяет понять, что надо делать чтобы добиться тех самых результатов.

Очень часто бывает так, что сотрудник ведет один или несколько таких про-ектов, организует людей и в тоже вре-мя участвует в других проектах в силу своей экспертизы и навыков. Соответ-ственно сейчас я занимаюсь активно- стями, связанными с подготовкой кон-тента – технологических статей и веб-кастов, работой над некоторыми разде-лами сайта MSDN, над направлением связанным с нашим клиентским стеком технологий, взаимодействую со студен- тами в рамках программы MSP и сооб-ществом MVP, участвую в организации крупных мероприятий. u

? ?

Page 12: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 12

И нтервью

С другой стороны, у всех наших еванге- листов, в том числе и у меня, есть тех-нологический фокус – несколько тех- нологий и продуктов, в которых мы от-лично разбираемся. Таким основным продуктом для меня являются наши средства разработки – Microsoft Visual Studio и Team Foundation Server. Этим направлением я занимаюсь уже не один год, провожу тренинги по коллек-тивной разработке, семинары и меро-приятия, которые подготавливаю сво-ими силами и с помощью сообщества статьи. В том числе я привлекаюсь к работе над внедрением этих продуктов у заказчиков. Это позволяет получать реальный опыт, подкрепляя теоретиче-ские знания.

Microsoft, как один из гран-дов индустрии, несомненно имеет колоссальный опыт коллективной разработки. Делитесь ли вы этим опы-том или же это тщательно охраняемый секрет?

Замечательный вопрос. Очень часто на семинарах и презентациях меня про-сят рассказать о том, как организованы процессы разработки в Microsoft, в на-дежде на то, что эти знания позволят сделать все пусть и не идеально, но с видимым результатом. Во-первых, это никакой не секрет и в основном внутри Microsoft используется подход Micro-soft Solutions Framework и Security De- velopment Lifecycle. Но как обычно, «дьявол в деталях». Годами выстраива-емый процесс породил массу уникаль-ных дополнений и решений, которые специфичны именно для нашей ком-пании. Приведу пример – Team Foun- dation Server и Visual Studio создаются на базе их же самих. Шаблон процесса для TFS, который используется DevDiv (подразделение по созданию Visual Stu- dio) модифицирован. В описании бага присутствует, по меньшей мере, на со-рок полей больше по сравнению с тем, который входит в комплект поставки TFS «из коробки». Можно конечно по-

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

Так как же быть? У кого перенимать опыт и делать процесс коллективной раз-работки правильным? Или может быть совсем отка-заться от процессов, коль скоро они вносят столько бюрократии?

Следует четко отделять процессы от целей, которые перед нами стоят. Про-цесс ради процесса – это, вообще, ужас-

ная вещь. Но нам-то с вами надо соз-дать программный продукт, выпустить его в свет и наладить сопровождение. Другими словами, наладить жизненный цикл, и управлять им. Здесь мы плав-но переходим к такому понятию, как управление жизненным циклом про-граммного продукта – Application Life- cycle Management. В рамках ALM од-ним из важных моментов является ме- ханизм прозрачности и понимания того, что происходит на проекте в любой мо-мент. Сколько багов сейчас у вас на проекте? В каком модуле их больше всего? Каков процент покрытия кода те-стами? Сколько требований осталось реализовать? Сколько строчек кода до-бавлено в модуль? Сколько времени потребует выполнение задач на теку-щей итерации? Перечень таких вопро-сов на реальном проекте значительно больше. Но зная эту информацию, вы можете в любой момент ответить на очень важный вопрос: как у нас идут дела? Может быть, мы отстаем от гра- фика, и надо привлекать дополнитель- ные ресурсы? Другими словами, вы постоянно осведомлены и готовы бо-роться за успех проекта с помощью реальных действий. Очень важным мо-ментом при этом является снижение объема субъективных показателей в этой информации. Люди часто пере-оценивают свои возможности и опти-мистичны в оценках. Если вы будете их просто опрашивать о том, как идут дела на проекте и доверять их мнению, то может оказаться что у вас на проек-те все до последнего было просто иде-ально, но в день презентации продукта окажется, что половина функций не ра-ботает, а половина содержит ошибки.

Возвращаясь к заданному вопросу ста- новится понятно, что процессы коллек- тивной разработки – это набор предска-зуемых действий и некоторых правил, которые позволяют вам в последствии иметь ценную информацию. Рассмат-ривайте процессы разработки как до- u

?

?

Page 13: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 13

И нтервью

кументооборот. Вам остается только найти баланс между предсказуемостью (обеспечивается процессом и бюрокра-тией) и прозрачностью (обеспечивает-ся метриками).

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

Тут-то нам на выручку и приходит опыт индустрии в целом. Основные шаги, итерации, действия, которые возника-ют на любом проекте, уже давно из-вестны. Разработаны десятки методо-логий, начиная с Waterfall и заканчивая экзотикой вроде You Ain’t Gonna Need It (YAGNI). Я, конечно, не призываю из-учать их все, среди этих методологий явно есть фавориты, такие как подход Agile, рекомендации Scrum и CMMI. Конечно, в случае CMMI объем доку-ментации, которую придется изучить, может быть неожиданно большим. С другой стороны, Scrum Guide – это до- кумент в 17 страниц. Начните применять эти методологии и процесс как есть, без особой оглядки на ваше возмож-ное непонимание каких-то моментов. Обратите внимание на то, какие потен-циальные метрики в последствии вы получите. Если вам кажется, что про-зрачности и понимания текущего состо-яния недостаточно, вносите изменения в процесс, делайте шаги, которые дают вам эту информацию. Этот подход мо-

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

Но не приведет ли такой подход к тому, что команда хотела использовать подход Agile, а получилось у них со-всем не то, не так и совсем не по канонам Agile?

Еще один замечательный вопрос, кото-рый мне самому нравится задавать на конференциях и семинарах. Звучит он примерно так: «Кто из вас в зале счита-ет, что применяет для разработки под-ход Agile, хотя бы частично?». После того как часть людей поднимает руку, я задаю следующий вопрос: «Кто из вас считает, что вам удается применять Agile максимально полностью?». В этом случае количество поднятых рук значи-тельно меньше. Подвох заключается в том, что нет никакого «истинно верного Agile». Суть самого слова Agile – «гиб- кий», подразумевает, что вы можете в своих процессных подходах вносить (или не вносить, или вообще что-то не делать) необходимые изменения. Agile всего лишь декларирует ваши цели – создать нужный программный продукт. Не документ с требованиями. Не базу данных с багами. Не веб-сайт с отчетами о времени выполнения задач. Agile – это манифест с тремя абзацами текста. Это не процесс, не методология, не ре-комендация. Но при этом существуют реализации процессов, опирающихся на принципы Agile, например это шабло-ны процессов MSF/Agile и Scrum/Agile, которые поддерживаются Team Foun- dation Server.

Если вы используете этот шаблон про-цесса на проекте, но при этом не сле-дуете всем шагам, которые рекомен-дованы, это совсем не значит, что вы делаете что-то не так. Как однажды ска- зал Брайан Харри в своем блоге: «наш процесс, ваш процесс, или никакого процесса». Рассматривайте этот вопрос через тот самый баланс между пред-сказуемостью и прозрачностью. Если вы получаете нужные метрики, которые позволяют вам отвечать на вопрос «как идут дела», значит вы на верном пути.

Каким образом формиру-ются метрики? Откуда их брать и как обрабатывать?

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

живаемость данных (traceability), то вы обладаете более точными сведения-ми. Чем больше интегрированы ваши подсистемы контроля версий, списка требований, багов и другие компонен- ты – тем больше синергии в этих дан-ных. Но интеграция этих компонент может требовать времени и дополни-тельных усилий, возможно проще ис-пользовать готовые решения, такие как Team Foundation Server. В документа-ции к TFS подробно описан перечень метрик, которые формируются на ос-новании сбора данных из всех подси-стем и вносимых туда изменений на основе процессов. Какая-то часть из них вообще не требует усилий по сбо-ру, вы просто работаете с системой, а «первичная бухгалтерия» заполняется за вас. И вам остается только открыть отчет, чтобы посмотреть текущее со-стояние дел. Собственно в этом вся суть TFS. Это инструмент, который по-зволяет вам узнавать, как идут дела и принимать решения. А уж попутно он содержит интегрированные компонен-ты по багтрекингу, контролю версий, управлению задачами, требованиями, процессом и так далее.

И еще один вопрос, чего ожидать в будущем в контексте организации командной разработки? Что нам ждать в будущем от Microsoft в этом контексте?

На мой взгляд, ожидать каких-то ме-тодологических прорывов в области процессов командной разработки в ближайшем будущем не приходится. Если начать изучать эти вопросы более подробно, то мы неизбежно наткнемся на области не связанные с IT. Это из-учение работы социальных групп, пси-хология, вопросы мотивации. Скорее надо ожидать улучшений в инстру-ментах. В первую очередь повышение уровня автоматизации процессов, боле тесная интеграция, уменьшение коли-чества рутины. Что же касается наших продуктов, то мы готовим некоторое количество нововведений как в среду Visual Studio, так и в TFS, и средства тестирования. Уже несколько месяцев функционирует тестовая версия «Об-лачного» TFS и возможно кто-то из читателей получил промокод и может попробовать его возможности. Но бо-юсь, что рамки интервью не дадут мне возможности ответить на этот вопрос более подробно.

Дмитрий, спасибо за ин-тересное интервью, было очень интересно пообщать-ся!

И вам спасибо за отличный и интерес-ный журнал и возможность высказать свои мысли на его страницах! n

??

?

?

?

Page 14: 12 (04) MSDeveloperRU

Ноябрьский список обновлений центра загрузки Microsoft

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

Примечание: каждый понедельник в 10 часов утра мы публикуем на сайте журнала еженедельный бюллетень обновлений центра загрузок Microsoft.

c Update for Windows Thin PC (KB2539566)

c Live@edu SSO Toolkit

c For IT professionals: Getting started with Microsoft Office 2010

c SOA Applications, Infrastructure and Management with Windows® HPC 2008 R2

c Open Specifications Preview Specifications

c Microsoft Office 365 Service Descriptions and Service Level Agreements for Dedicated Subscription Plans

c Microsoft Dynamics AX 2012 and 2009 Reference: Report List

c Kinect for Windows SDK v1.0 Beta 2

c Windows Server Solutions Log Collector Tool

c System Center Service Manager 2012 Beta

c Microsoft Malware Protection Center Threat Report - Poison Ivy

c Microsoft Dynamics CRM 2011 Implementation Guide

c Microsoft Expression Encoder 4 with Service Pack 2 (SP2)

c Office 365 for professionals and small businesses Service Description

c Product Documentation for Microsoft SQL Server 2012 Release Candidate 0 (RC0) for firewall and proxy restricted environments

c Microsoft Management Reporter: Installation, Migration, and Configuration

c Microsoft Office 365 Service Descriptions and Service Level Agreements for Dedicated Subscription Plans

c The Evolution of User-Generated Content (UGC) (US)

c Maximizing Digital Revenue for Arcade Titles (US)

c The Evolution of User-Generated Content (UGC) (UK)

c Game Developer Network Portal Tips & Tricks (US)

c Maximizing Digital Revenue for Arcade Titles (UK)

c Maximizing Digital Revenue for Retail Titles (US)

c The Digital Manual is Tomorrow’s Manual...Today! (US)

c Feedback, Feedback, Feedback: Good Kinect UI Design (UK)

c Bing Spatial Data Services SDK (CHM)

c Maximizing Digital Revenue for Retail Titles (UK)

c The Digital Manual is Tomorrow’s Manual...Today! (UK)

c Feedback, Feedback, Feedback: Good Kinect UI Design (US)

c Game Developer Network Portal Tips & Tricks (UK)

c Bing Spatial Data Services SDK (PDF)

c Open Specifications Preview Specifications

c Office 365 for Enterprise Service Descriptions

c Microsoft Online Services Sign-In Assistant for IT Professionals RTW

c Microsoft Dynamics AX 2012 White Paper: Country-Specific Update for Norway

c Microsoft® SQL Server® ODBC Driver for Linux

c Update for Root Certificates [November 2011] (KB931125)

c Update for Windows Server 2008 R2 x64 Edition (KB2633952)

c Update for Windows XP (KB2633952)

c Update for Windows Server 2003 (KB2633952)

c Update for Windows Server 2008 x64 Edition (KB2633952)

c Update for Windows Embedded Standard 7 (KB2633952)

c Update for Windows Server 2003 x64 Edition (KB2633952)

c Update for Windows 7 for x64-based Systems (KB2633952)

c Update for Windows Server 2008 (KB2633952)

c Update for Windows Server 2003 for Itanium-based Systems (KB2633952)

c Update for Windows 7 (KB2633952)

c Update for Windows Server 2008 for Itanium-based Systems (KB2633952)

c Update for Windows XP x64 Edition (KB2633952)

c Update for Windows Vista for x64-based Systems (KB2633952)

c Update for Windows Embedded Standard 7 for x64-based Systems (KB2633952)

c Update for Windows Vista (KB2633952)

c System Center 2012 Orchestrator Integration Pack for Active Directory BETA

c Microsoft Lync 2010 Phone Edition for Polycom CX500, Polycom CX600 and Polycom CX3000

c Microsoft Lync 2010 Phone Edition for Aastra 6721ip and Aastra 6725ip

c Microsoft Lync 2010 Phone Edition for HP 4110 and HP 4120

c Cumulative Update 3 for System Center Service Manager 2010 SP1 (KB2588492)

c Microsoft Lync 2010 Phone Edition for Polycom CX700 and LG-Nortel IP Phone 8540

c Lync Server 2010 Group Chat Hotfix KB 2514984

c Lync Server 2010 Hotfix KB 2493736

c Lync 2010 Group Chat Admin Tool Hotfix KB 2636063

c Lync 2010 Group Chat Hotfix KB 2636065

c Lync Server 2010 Group Chat Hotfix KB 2514984

c Lync Server 2010 Hotfix KB 2493736

c Lync 2010 Group Chat Admin Tool Hotfix KB 2636063

c Lync 2010 Group Chat Hotfix KB 2636065

c Lync 2010 Hotfix KB 2514982 (32 bit)

c Lync 2010 Hotfix KB 2514982 (64 bit)

c Microsoft® SQL Server® 2012 Release Candidate 0 (RC0)

c System Center 2012 - Service Manager Product Documentation

c Microsoft Dynamics AX 2012 White Paper: Credit Card Processing

c Microsoft Dynamics AX 2012 Privacy Statement

c Privacy in the Cloud: Office 365

c Microsoft Dynamics AX 2012 System Requirements

Page 15: 12 (04) MSDeveloperRU

c Microsoft® SQL Server® 2012 RC0 End User License Agreements and Privacy Statement

c Unified Communications Phones and Peripherals Datasheets

c Microsoft adCenter Desktop

c Office 365 for Enterprise Service Descriptions

c Microsoft® SQL Server® 2012 Express RC0

c Microsoft® SQL Server® 2012 PowerPivot® for Microsoft® Excel® 2010 Release Candidate 0 (RC0)

c Microsoft® SQL Server® 2012 Semantic Language Statistics RC

c Microsoft® SQL Server® 2012 RC0 Master Data Services Add-in For Microsoft® Excel®

c Microsoft® SQL Server® 2012 Release Candidate 0 (RC0) Manageability Tool Kit

c Update for Windows Server 2003 (KB2641690)

c Update for Windows XP x64 Edition (KB2641690)

c Update for Windows Server 2003 for Itanium-based Systems (KB2641690)

c Update for Windows Server 2003 x64 Edition (KB2641690)

c Kodu Game Lab

c Microsoft Volume Licensing Service Center (VLSC) User Guide

c Precompiled Command Buffers: Care and Feeding (US)

c “Xbox, Listen”: Using Speech Recognition with Kinect (UK)

c Getting Started with Application Deployment with the Windows Azure HPC Scheduler

c Designing Compelling Player Experiences with Kinect Identity (UK)

c Making the Most of XAudio2’s xAPO Framework (UK)

c The Modern Dr. Dolittle: Talkingtothe Kinectimals with NuiSpeech (UK)

c Sounds Great! Lessons Learned in Microsoft Studios Central Audio, from AAA to XBLA (UK)

c An Array of Options: Driving Gameplay with Kinect Audio Input (UK)

c Audio Talks Pitch Shifted: Three Lectures in One (UK)

c Higher-Performance XAudio2 (UK)

c Learning from Others to Create Meaningful 3D (UK)

c Voice and «Other Sounds» Interaction: Beyond Simple Speech Recognition (UK)

c SQL Azure Data Sync Agent Preview

c System Center 2012 Orchestrator Integration Pack for Active Directory BETA

c System Center Service Manager 2012 Beta

c HPC Pack 2008 R2 Express with Service Pack 3

c Delivering Business-Critical Solutions with SharePoint 2010

c Microsoft Office 365 Service Descriptions and Service Level Agreements for Dedicated Subscription Plans

c Microsoft Visio 2010 WBS Modeler

c System Center Operations Manager 2012 Release Candidate

c Exchange Server Active Directory Schema Changes Reference, November 2011

c Infrastructure Planning and Design

c Windows Azure Platform Training Kit - November Update

c Exchange Server 2010 SP2 UM Language Packs

c Microsoft Exchange Server 2010 Service Pack 2 (SP2)

c Microsoft Assessment and Planning Toolkit

c Windows Management Framework 3.0 - Community Technology Preview (CTP) #2

c Open Specifications Preview Specifications

c Microsoft Dynamics CRM 2011 Software Development Kit (SDK)

c Microsoft Enterprise Library 5.0 Integration Pack for Windows Azure

c Microsoft Office 2010: Primary Interop Assemblies Redistributable

c Microsoft Messenger for Mac 7.0.3

c Microsoft Lync Server 2010 Resource Kit Tools

c Linux Integration Services Version v3.2 for Hyper-V

c Office 365 Deployment Guide for Enterprises

c Microsoft adCenter Desktop

c Microsoft Unified Communications Managed API 2.0 SDK (64 bit)

c Live@edu Hotmail to Outlook Live Migration FAQ

c Microsoft Visio 2010 WBS Modeler

c Microsoft Visio 2010 for SharePoint Network Topology

c Microsoft Office 2010 System End User TrainingToolkit

c Unified Communications Phones and Peripherals Datasheets

c Biztalk Terminator

c Arcticles on Parallel Programming with the .NET Framework 4.5

c Windows Internet Explorer Platform Preview

c Microsoft Visio 2010 for Value Stream Map

c System Center 2012 - Service Manager Product Documentation

c Forefront Unified Access Gateway (UAG) Tracing Symbols

c Volume Licensing Program Guides, Datasheets, and FAQs

c Multi-Targeting Pack for Microsoft .NET Framework 4.0.3 Beta (KB2599652)

c Update 4.0.3 Beta for Microsoft .NET Framework 4 – Design-time Update for Visual Studio 2010 SP1 (KB2599653)

c Update 4.0.3 Beta for Microsoft .NET Framework 4 – Runtime Update (KB2599651)

c Office 365 for professionals and small businesses Service Description

c Product Documentation for Microsoft SQL Server 2012 Release Candidate 0 (RC0) for firewall and proxy restricted environments

c Microsoft Management Reporter: Installation, Migration, and Configuration Guides

c Productivity Hub 2010 SP1

c Microsoft Office 365 Service Descriptions and Service Level Agreements for Dedicated Subscription Plans

c The Evolution of User-Generated Content (UGC) (US)

c Maximizing Digital Revenue for Arcade Titles (US)

c The Evolution of User-Generated Content (UGC) (UK)

c Game Developer Network Portal Tips & Tricks (US)

c Maximizing Digital Revenue for Arcade Titles (UK)

c Maximizing Digital Revenue for Retail Titles (US)

c The Digital Manual is Tomorrow’s Manual...Today! (US)

c Feedback, Feedback, Feedback: Good Kinect UI Design (UK)

c Bing Spatial Data Services SDK (CHM)

c Maximizing Digital Revenue for Retail Titles (UK)

c The Digital Manual is Tomorrow’s Manual...Today! (UK)

c Feedback, Feedback, Feedback: Good Kinect UI Design (US)

c Game Developer Network Portal Tips & Tricks (UK)

c Bing Spatial Data Services SDK (PDF)

c Office 365 for Enterprise Service Descriptions

c Microsoft Online Services Sign-In Assistant for IT Professionals RTW n

Page 16: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 16

W indows Presentation Foundation

ClickOnce, WPF, MSBuild и несколько окружений

АвторАндрей Гордиенков[email protected]://softblog.violet-tape.ru/г. Москва

На днях мне нужно было решить следующую, на мой взгляд, достаточно распространенную задачу по раз-мещению двух версий приложения. Одна версия QA –

для тестирования текущих наработок, то, что реализуется каждый день: UI, логика, исправление мелких ошибок. Дру-гая версия – Prod – для тестирования общих алгоритмов на реальных данных. В целом стандартная практика в мире раз-работки.

Решение этой задачи оказалось не столь стандартное и про-стое как я ожидал, но обо всем по порядку.

Диспозиция

В качестве исходных данных мы примем то, что у вас есть работоспособное приложение на WPF (для WinForm будет то же самое, но WPF более сложный случай), которое можно ло-кально собрать в нескольких конфигурациях: Dev, QA(Cons), Prod. Не важно, что именно у вас зависит от конфигурации, в общем случае, скорее всего, это строки соединения с базой данных, оптимизация и логирование ошибок/действий поль-зователя.

Так же, как дополнительное условие, все конфигурации долж-ны собираться на билд-сервере, в данном случае на TFS и при использовании MSBuild. То, что дальше описывается, можно собирать и локально с помощью командной строки. Так что TFS – усложнение задачи, которое будем принимать во внимание.

Кроме этого у вас успешно настроена на публикацию из Vi-sualStudio с помощью ClickOnce хотя бы одна конфигурация приложения.

Еще раз, что у нас есть:

{ WPF приложение,

{ у приложения несколько рабочих конфигураций,

{ все конфигурации компилируются на билд-сервере (TFS),

{ хотя бы одна конфигурация публикуется с помощью ClickOnce из VisualStudio.

Проблема

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

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

На сервер складываются разные версии приложе-ния, но при установке пользователю, одна версия затирает другую.

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

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

Итак, как было уже ранее сказано, у вас есть приложение, которое работоспособно и собирается на билд-сервере.

Стандартная публикация ClickOnce

Публикация ClickOnce приложения настраивается в свой-ствах головного (исполняемого) проекта.

Вам надо настроить папку на сервере для выкладывания го-тового приложения, и задать адрес, где будет опубликован файл publish.htm. u

Page 17: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 17

W indows Presentation Foundation

Опустим в данном случае Аpplication Files, Prerequisites, Up- dates, а остановимся на Options.

Здесь задаются основные данные, которые вы увидите на странице publish.htm, она, к слову, выглядит приблизительно так:

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

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

Публиковать приложения из VS, в целом, являет-ся моветоном.

После того, как вы опубликовали приложения в две разные директории, это не значит, что они будут различными с точки зрения системы клиента. Они будут идентичны. Можете про-верить на досуге.

Отличительные признаки

После копания в сети, оказалось, что отличительными при-знаками приложения с точки зрения клиентской системы яв-ляются:

{ имя сборки,

{ имя приложения.

Имя сборки:

Имя приложения:

Казалось бы, вот оно счастье и решение всех проблем, но не тут-то было.

Я уже упомянул, что для пущей сложности у нас WPF при-ложение, которое завязано на имени сборки, и поменять его запросто не получится, потому что у нас есть достаточное количество пользовательских экранов (UserControl) и объ-явления XAML, которые начинается как:

<UserControl x:Class=”Leader.ARM.Accounting.Views.AccountsAnalysisView” xmlns=”http://schemas.microsoft.com/winfx/ 2006/xaml/presentation” …

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

Дальнейший поиск и логика показали, что наверно можно поискать правды в файле %Публикуемый_проект%.appli-cation. Данный файл находится по адресу публикации при-ложения и в директории сборки проекта.

В моем случае это Accounting.application – это простой xml файл, который можно открыть в любом текстовом редакторе. Открываем и пытаемся найти там отличительные признаки. u

Page 18: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 18

W indows Presentation Foundation

<?xml version=”1.0” encoding=”utf-8”?><asmv1:assembly не_важно_тут_стандартные_схемы> <assemblyIdentity name=”Accounting.application” version=”0.5.0.23” publicKeyToken=”0000000000000000” language=”ru-RU” processorArchitecture=”x86” xmlns=”urn:schemas-microsoft-com:asm.v1” /> <description asmv2:publisher=”Лидер Инвест” co.v1:suiteName=”ARM .Net 0.5” asmv2:product=”ARM .Net (Test)” xmlns=”urn:schemas-microsoft-com:asm.v1” /> <deployment install=”true” mapFileExtensions=”true” co.v1:createDesktopShortcut=”true”> <subscription> <update> <beforeApplicationStartup /> </update> </subscription> <deploymentProvider codebase=”http://Server_X1/armQA/Accounting.application” /> </deployment> <compatibleFrameworks xmlns=”urn:schemas-microsoft-com:clickonce.v2”> <framework targetVersion=”4.0” profile=”Full” supportedRuntime=”4.0.30319” /> </compatibleFrameworks> <dependency> <dependentAssembly dependencyType=”install” codebase=”Application Files\Accounting_0_5_0_23\Accounting.exe.manifest” size=”47449”> <assemblyIdentity name=”Accounting.exe” version=”0.5.0.23” publicKeyToken=”0000000000000000” language=”ru-RU” processorArchitecture=”x86” type=”win32” /> <hash> <dsig:Transforms> <dsig:Transform Algorithm=”urn:schemas-microsoft-com:HashTransforms.Identity” /> </dsig:Transforms> <dsig:DigestMethod Algorithm=”http://www.w3.org/2000/09/xmldsig#sha1” /> <dsig:DigestValue>1dRMDHoKoUsB7bUWmC/GvUZllZc=</dsig:DigestValue> </hash> </dependentAssembly> </dependency></asmv1:assembly>

Поэкспериментируйте с настройками, для кого это в новин-ку. Однако настройки конфигурации не затрагивают закладку Publish c помощью которой происходит публикация прило-жений и значения:{ Publishing Folder, { Installation Folder URL.

не привязываются к конфигурации окружения.

Это поначалу может показаться камнем преткновения, но так как определения всех проектов и способов их сборки обозна-чаются в XML нотации, то логично предположить, что: u

Методом проб и ошибок, а так же с учетом ранее полученной информации обнаруживаем, что самая важная часть в раз-личии приложений является:

assemblyIdentity name=”Accounting.application” asmv2:product=”ARM .Net (Test)”

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

Т. е. если вы в одной из папок (QA) с опубликованным прило-жением поменяете эти значения, так, чтобы они отличались от другой программы (Prod) и попробуете установить прило-жения, то вы получите две разные программы. Это выразится в двух ярлыках на рабочем столе и в меню Пуск. Если конеч-но в настройках публикации указано создание ярлыков.

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

Подготовка проекта

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

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

Для многих не новость, что настройки проекта меняются в за-висимости от того, какая конфигурация выставлена. Напри-мер, в конфигурации Debug объявляются символы DEBUG, TRACE, можно указать определенные PreBuild и PostBuild действия. Если переключить конфигурацию в Release, то можно увидеть, как исчезнут галки с опций объявления сим-вола DEBUG.

Page 19: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 19

W indows Presentation Foundation

все видимые настройки имеют свое отобра-жение в схеме XML, и с помощью определенных свойств мы сможем задать эти значения.

Настройка адресов публикации

По большому счету VisualStudio больше нам не помощник и все дальнейшие действия будут совершаться с помощью No-tepad++ и командной строки из окружения VisualStudio.

Открываем в Notepad++ файл публикуемого проекта, в моем случае, как вы заметили это Accounting.csproj. Находим сек-ции, где определяются настройки, зависящие от конфигура-ции. Их легко найти по отличительным признакам:

{ находятся в начале файла, в районе 40-50 строки,

{ начинаются с <PropertyGroup Condition=” ‘$(Confi-guration)|$(Platform)’ == ‘Debug|x86’ ”>

В начале файла это практически всегда самые длинные стро-ки. Итак, ищем свои конфигурации, в моем случае это:

<PropertyGroup Condition=” ‘$(Configuration)|$(Plat-form)’ == ‘Release|x86’ ”><PropertyGroup Condition=”’$(Configuration)|$(Plat-form)’ == ‘Prod|x86’”>

Первая для Cons, вторая для Prod. Вот так вот не согласо-вано – показываю на примере реального проекта, а создать конфигурацию легче и лучше, на мой взгляд, чем возиться с определениями символов.

После того, как вы нашли свою секцию с определением кон-фигурации, надо будет добавить следующие настройки:

<InstallUrl>http://Server_X1/armQA/</InstallUrl> <PublishDir>\\Server_X1\armQA\</PublishDir>

Конечно, адреса сервера должны быть ваши. Не обращайте внимания, если VS будет ругаться на недопустимые тэги, на самом деле все хорошо. Полная секция в простейшем вари-анте выглядит так:

<PropertyGroup Condition=” ‘$(Configuration)|$(Plat-form)’ == ‘Release|x86’ ”> <PlatformTarget>x86</PlatformTarget> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <OutputPath>bin\Release\</OutputPath> <DefineConstants>TRACE;CONS</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <InstallUrl>http://Server_X1/armQA/</InstallUrl> <PublishDir>\\Server_X1\armQA\</PublishDir></PropertyGroup>

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

Проверка публикации

На данном этапе можно проверить работу только что введен-ных переменных путем публикации приложения из команд-ной строки. Однако имя приложения все еще не изменится. Это мы сделаем немного позже и уже в другом файле. Снача-ла опробуем публикацию приложения из командной строки. Открываем Visual Studio Command Prompt.

Переходим в директорию проекта, или же надо будет указать полный путь до файла .sln при использовании MSBuild.

Далее набираем msbuild «arm .net.sln» /t:Publish /p: Configuration=Release и запускаем. Будет много-много тек-ста, и в конце концов напишут что ошибок нет и время пу-бликации такое-то. В данном случае для нас важным пара-метром является указание цели сборки – Publish. Для этого происходит rebuild и публикация проекта. Сколько бы раз вы не запускали эту команду, проект будет опубликован с по-следней указанной версией на закладке Publish.

Если все прошло без ошибок, то можно проверить, что опу-бликовалась версия для QA (удалите файлы из папки для пу-бликации и запустите ее снова). В моем случае – QA (Cons), так как она связана с конфигурацией Release.

Для публикации Prod версии надо будет выполнить msbuild «arm .net.sln» /t:Publish /p:Configuration=Prod.

Если все хорошо, а так и должно быть, то переходим к следу-ющему пункту. Тут стоит упомянуть, что при такой публикации не будет создана страница publish.htm, однако эту проблему мы решим, но чуть позже.

Версионность

Публикация с одной и той же версией нас не устраивает совершенно, так как тогда клиент не сможет распознать, что появилась новая версия. Версию можно передать во время сбор- ки приложения с помощью параметра Applica-tionVersion.

msbuild «arm .net.sln» /t:Publish /p:Configuration= Release;ApplicationVersion=0.5.0.34

Но это неудобно – как увеличивать номера при автоматиче-ской сборке?

Вообще вопрос составления версий не столь простой как может показаться. На первый взгляд, нумерация в духе 0.5.1.456 вполне хороша. Я тоже так подумал, нашел реше-ние для увеличения номера ревизии (последний номер в версии продукта), однако это решение опиралось на внеш-ний файл, в который и записывалась текущая версия. Такой подход не годился для Continuous Deployment, так как после сборки я не смогу зачекинить файл с версией обратно в TFS. Честно говоря, даже если это и возможно, то сама мысль мне показалась порочной и я не стал искать в этом направлении.

Следующей идеей, на которой я и остановился, представле-ние версии в виде некоторой комбинации временных значе-ний. Например, мне понравился вариант:

(Главная версия).(Версия и Год).(Порядковый номер дня в году).(Час и минута)

Примеры: u

Page 20: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 20

W indows Presentation Foundation

1.411.302.10010.012.12.2322

Данную версионность мы и реализуем в программе. Реали-зовать свою комбинацию будет не очень сложно, честное слово.

Версию приложения надо будет передать и для сборки (что-бы можно было в свойствах исполняемого файла увидеть версию приложения), и для публикации.

Подготовка к трансформации проекта

Чтобы у нас все получилось, потребуется скачать и устано-вить на машине билд-сервера MSBuild Community Tasks Pro-ject, так же советую его поставить и на своей машине для экспериментов и быстрого доступа к файлу справки. Данный пакет позволяет обращаться к реализации массы наиболее часто востребованных функций во время преобразований в процессе построения приложения с помощью MSBuild. Пакет устанавливается по адресу C:\Program Files (x86)\MSBuild\MSBuildCommunityTasks, это чтобы вы быстро нашли справку по новым доступным задачам.

Канон

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

MSBuild при сборке проекта руководствуется сложным набором правил и указаний, которые мы можем модифицировать или дополнять. Основные указания о сборке проекта содержатся в файле Common.CSharp.targets, который менять каким-либо образом крайне не рекомендуется.

По принятому соглашению все дополнения и расширения, касающиеся построения приложений должны иметь расши-рение .targets, по сути это XML файл.

Итак, нам придется: { немного модифицировать файл проекта .csproj, { создать новый файл .targets.

Начнем с создания нового файла в корне исполняемого про-екта, в котором будем изменять параметры построения и публикации нашего приложения. Файл можете назвать как угодно, я назвал Publishing.targets. В начало файла следует скопировать определение проекта из файла .csproj того про-екта, который вы будете публиковать. Т. е. открываю файл Accounting.csproj в Notepad++, и копирую узел объявления проекта в новый файл. В итоге в файле Publishing.targets должно быть что-то в духе:

<Project ToolsVersion=”4.0” DefaultTargets=”Build” xmlns=”http://schemas.microsoft.com/developer/msbuild/2003”></Project>

Сохраняем и начинаем вносить изменения в исполняемый проект. Надо внести ссылки на MSBuild Community Task Pro-ject и на наш новый файл.

Открываем файл проекта, перемещаемся вниз файла, нахо-дим тэги Imports и дописываем там свои две строчки:

<Import Project=”Publishing.targets” /><Import Project=”$(MSBuildExtensionsPath)\MSBuild-CommunityTasks\MSBuild.Community.Tasks.Targets” />

Указываем путь до нового файла, имя напишите свое, путь относительный от проекта, и указываем путь до расширений MSBuild – тут по идее ничего менять не надо. Пробуем со-брать проект из командной строки, все должно быть хорошо для конфигураций Release и Prod. Для тех разработчиков, у которых не стоит MSBuild Community Task Project, проект не соберется и будет просить установить недостающие библи-отеки. Чтобы этого избежать сделаем включение задач из MSBuild CTP опциональным, для всех конфигураций кроме Debug.

<Import Project=”Publishing.targets” Condition=” ‘$(Configuration)|$(Platform)’ != ‘Debug|x86’ “/><Import Project=”$(MSBuildExtensionsPath)\MSBuild-CommunityTasks\MSBuild.Community.Tasks.Targets” Condition=” ‘$(Configuration)|$(Platform)’ != ‘De-bug|x86’ “/>

Создание страницы публикации

Как уже было упомянуто выше, при публикации из команд-ной строки, страница publish.htm не будет создана автомати-чески, так что нам придется подготовить шаблон страницы, включить в проект и затем в процессе публикации копировать ее в папку, где будет опубликовано итоговое приложение.

Не буду тут приводить полный текст файла publish.htm, лучше его скачать здесь. Затем можете отредактировать его на свой вкус: перевести, дополнить информацией или удалить лиш-ние пункты. Главное оставить/добавить уникальные иденти-фикаторы для последующей замены во время публикации.

Отредактированный файл надо включить в проект, я создал папку Publish и поместил туда publish.htm.

О том, как заменять значения в этом файле речь пойдет чуть ниже.

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

Замена значений по условию

Наверно, это самый важный момент для того, чтобы приложение для разных окружений вос-принималось клиентом как две разных програм-мы. Сейчас будем устанавливать значения для окружения QA и PROD. u

Page 21: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 21

W indows Presentation Foundation

Данные значения будут размещены в файле Publishing.tar- gets. Открываем файл и сразу за открытием тега Project вставляем код, все вместе должно выглядеть так:

<Project ToolsVersion=”4.0” DefaultTargets=”Build” xmlns=”http://schemas.microsoft.com/developer/msbuild/2003”> <Choose> <When Condition=” ‘$(ConfigurationName)’ == ‘Prod’ “> <PropertyGroup> <ArmApplicationId>&quot;Accounting.appli- cation&quot;</ArmApplicationId> <ArmApplicationName>АРМ .Net</ArmApplicati- onName> <ProductName>АРМ .Net</ProductName> </PropertyGroup>

</When> <When Condition=” ‘$(ConfigurationName)’ == ‘Release’ “> <PropertyGroup> <ArmApplicationId>&quot;Accounting.applica- tion.test&quot;</ArmApplicationId> <ArmApplicationName>АРМ .Net (Test)</Arm- ApplicationName> <ProductName>АРМ .Net (Test)</ProductName> </PropertyGroup> </When> </Choose></Project>

Данная секция описывает условный переход и присвоение значений переменным, которые будем использовать далее. Choose – контейнер для описания условий, далее использу-ется тег When в котором описывается условие для входа. В данном случае условие накладывается на значение конфигу-рации. Вам надо в условии выставить свои значения.

Далее идет тег PropertyGroup – он открывает секцию с объ-явлением переменных, так же в этой секции можно пере-писывать значения переменных. В этой секции ключевыми переменными являются:

{ ArmApplicationId – можете придумать свое имя, мы специально вводим эту переменную для модификации файла Accounting.application, который является конфигу-рацией опубликованного приложения.

{ ProductName – это существующее имя для названия продукта.

Описанные переменные должны иметь различные значения для каждой конфигурации. Прошу заметить, что значение переменной ArmApplicationId заключено в кавычки.

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

Замены для страницы опубликованного приложения

Теперь можно подготовиться к окончательному формирова-нию страницы опубликованного приложения publish.htm. Нам надо провести замены «переменных» в файле publish.htm, для этого продолжаем дописывать файл Publishing.targets и вставляем следующий код после секции Choose.

<ItemGroup> <Tokens Include=”PublisherName”> <ReplacementValue>$(PublisherName)</Replace-

mentValue> <Visible>false</Visible> </Tokens> <Tokens Include=”ProductName”> <ReplacementValue>$(ProductName)</Replacement- Value> <Visible>false</Visible> </Tokens> <Tokens Include=”Prerequsites”> <ReplacementValue>@(BootstrapperPackage->’ &lt;li&gt;%(ProductName)&lt;/li&gt;’, ’%0D%0A’)</ReplacementValue> <Visible>false</Visible> </Tokens> <Tokens Include=”Username”> <ReplacementValue>$(Username)</Replacement- Value> <Visible>false</Visible> </Tokens> </ItemGroup>

В данных заменах пока что нет версии приложения. Это ско-ро будет исправлено.

В действии

Собственно сейчас осталось только указать время, когда про-изводить указанные замены. Для этого можно переопреде-лить несколько событий (в терминологии MSBuild – Targets), сейчас же нам понадобится только AfterPublish.

В описании этого события мы внесем последние изменения в страницу приложения, опубликуем страницу, а так же сде-лаем так, чтобы для клиента опубликованные приложения CONS и PROD были разными программами.

Прежде чем указать действия для AfterPublish, надо соз-дать переменную для публикации файла publish.htm

<PropertyGroup> <PublishFilePath>$(PublishDir)publish.html</Pub- lishFilePath> </PropertyGroup>

Поместите этот код в конце файла Accounting.targets перед закрывающим тегом </Project>. Следующим шагом будет реализация AfterPublish:

<Target Name=”AfterPublish”> <Time Format=”dd/MM/yyyy HH:mm”> <Output TaskParameter=”FormattedTime” Proper- tyName=”PublishTime” /> </Time> <TemplateFile Template=”Publish\publish.templa- te.html” Tokens=”@(Tokens)” OutputFilename=”$ (PublishFilePath)” /> <FileUpdate Files=”$(PublishFilePath)” Regex= ”\${PublishTime}” ReplacementText=”$(Publish- Time)” /> <FileUpdate Files=”$(PublishDir)Accoun- ting.application” Encoding=”ASCII” Regex=” &quot;Accounting.application&quot;” Replace- mentText=”$(ArmApplicationId)” /> </Target>

Первой строкой идет указание того, когда это будет выполне-но – AfterPublish – зарезервированное имя, доступное к пе-реопределению. Далее идет использование задачи Time из пакета MSBuild Community Task, с помощью этой задачи бу-дем указывать время публикации на странице publish.htm. u

Page 22: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 22

W indows Presentation Foundation

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

Следующие две задачи опять из пакета MS Build Community Task и позволяют заменять значения в файлах. По структу-ре вы можете догадаться о работе данной задачи. В нашем случае мы выставляем время публикации, а так же делаем уникальным идентификатор приложения, по которому (со-вместно с ProductName) клиент будет думать, что у него раз-ные приложения.

Можно снова попробовать опубликовать приложение с раз-ными настройками конфигурации и установить их у себя. Вы увидите, что установилось два приложения: QA (Cons) и PROD. Они работают независимо и не мешают работе друг друга.

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

Создание версий

Как вы могли прочитать или заметить на собственном опы-те, версия приложения и опубликованная версия – это две совершенно разных версии, однако желательно привести их в соответствие. Версия приложения хранится в AssemblyIn- fo.cs, версия публикации – в файле *.publish (это по версии интернетов, однако я не смог найти этот файл, так что для меня загадка, где хранится номер опубликованной версии.)

С помощью задач из пакета MSBuild CTP можно создать свой файл AssemblyInfo.cs, в котором писать номер версии до того, как проект начнет собираться.

По условию задачи становится понятно, что надо искать и модифицировать цель\задачу (targets) с назаванием Before-Build. Эту задачу можно найти в конце файла *.csproj для публикуемого проекта. Задача закомментирована, так что вы можете удалить комментарий и внести следующий код в за-дачу: <Target Name=”BeforeBuild” Condition=” ‘$(Con-figuration)|$(Platform)’ != ‘Debug|x86’ “> <Attrib Files=”$(ProjectDir)Properties\Assem- blyInfo.cs” ReadOnly=”false” System=”false” /> <Time> <Output TaskParameter=”Hour” PropertyName=”Hour” /> <Output TaskParameter=”DayOfYear” PropertyNa- me=”Revision” /> </Time> <AssemblyInfo CodeLanguage=”CS” OutputFile=”$(Pro- jectDir)Properties\AssemblyInfo.cs”AssemblyVersion=”0.711.$(Revision).$(Hour)$([System.DateTime]::Now.Minute.ToString(&quot;00&quot;))”AssemblyFileVersion=”0.711.$(Revision).$(Hour)$([System.DateTime]::Now.Minute.ToString(&quot;00&quot;))”AssemblyCompany=”Leader Invest” AssemblyProduct=”Ap-plication” AssemblyCopyright=”Copyright © Leader Invest 2011” AssemblyTrademark=”Leader Invest” As-semblyCulture=”” /> <PropertyGroup> <ApplicationVersion>0.711.$(Revision).$(Hour) $([System.DateTime]::Now.Minute.ToString(“00”)) </ApplicationVersion> <ApplicationVersionPublishPage>0.711.$(Revi- sion).$(Hour)$([System.DateTime]::Now.Minute. ToString(“00”))</ApplicationVersionPublishPage> </PropertyGroup>

</Target>

Первым делом надо снять метку ReadOnly с файла Assem-blyInfo.cs. Это делается с помощью задачи Attrib. Далее используем задачу Time из пакета дополнений к MSBuild, и формируем новые переменные из значений, которые могут быть предоставлены задачей Time. Для нас актуальны: часы и порядковый день года. Тег Output заполняет переменные.

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

[System.DateTime]::Now.Minute.ToString(&quot;00&quot;)

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

После того, как создали новый файл AssemblyInfo.cs, записы-ваем значения новой версии в переменные:

{ ApplicationVersion – версия публикации,

{ ApplicationVersionPublishPage – для отображения на странице публикации.

После того, как указали все действия на момент сборки, осталось внести финальные изменения в файл Publishing.-targets. Надо внести изменения для использования Appli-cationVersionPublishPage.

<Target Name=”BeforePublish”> <ItemGroup> <Tokens Include=”ApplicationVersion”> <ReplacementValue>$(ApplicationVersionPub- lishPage)</ReplacementValue> <Visible>True</Visible> </Tokens> </ItemGroup> </Target>

Внесите этот кусок кода до определения задачи AfterPublish.

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

Осталось только создать новые определения сборок для билд-сервера и указать цель сборки Publish.

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

Page 23: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 23

.N ET Framework

Паттерн «наблюдатель» очень по-пулярен среди разработчиков. Он позволяет разделять код на

независимые компоненты, легко объ-единяя их в различных комбинациях. Принцип связывания данных (data binding) в WPF и Windows полностью основан на этом принципе.

Для реализации паттерна «наблюда-тель» в .NET, как правило, используют-ся события. Однако непродуманное ис- пользование событий может приводить к утечкам памяти и потерям произво-дительности. Все дело в том, что при стандартной реализации событий, в .NET объект, являющийся источником события, сохраняются сильные ссылки на всех подписчиков. Таким образом, если время жизни подписчика меньше времени жизни объекта-источника, не-обходимо вовремя удалять подписки на события. Подробно эта проблема рассмотрена в статье, опубликованной в предыдущем номере журнала (1).

Использование событий на слабых ссылках открывает целый пласт воз-можностей по созданию временных объектов, которые «отслеживают» со-бытия долгоживущих объектов. Такие объекты удаляются сборщиком мусо-ра автоматически, когда в них исчеза- ет необходимость. Например, объект может формировать некоторое пред-ставление данных и автоматически поддерживать его в актуальном состо-янии, обрабатывая уведомления об из-менении свойств исходных объектов. Аналогичным образом действуют ин-терфейсные элементы Windows Forms и WPF, при использовании связывания данных. При добавлении элемента в пользовательский интерфейс, он под-писывается на события, а удаление подписки происходит, например, при закрытии окна. Для объектов в про-граммах не всегда можно определить подобный естественный способ для удаления подписки. Использование со-бытий на слабых ссылках позволяет забыть об этой проблеме.

Подобные временные объекты особен-но удобны в качестве данных, отобра-

АвторБорис Романов [email protected]://dev-sol.blogspot.comКомпания: Projects Profiler LLCг. Москва

Практическое использование событий на слабых ссылках для уведомлений об изменениях

Время жизни подписчиков событий с сильными ссылками зависит от времени жизни объекта-источника события

Связанные представления

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

Кроме естественных преимуществ ис-

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

Page 24: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 24

.N ET Framework

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

А теперь рассмотрим несколько практических примеров ис-пользования событий на слабых ссылках:

{ функциональное связывание данных,

{ автоматические коллекции.

Функциональное связывание данных

Как следует из названия – это создание функциональной за-висимости между данными. Наиболее близким примером яв-ляется использование конвертеров при связывании данных WPF. Собственно, конвертеры связывания данных WPF и были прообразом этого решения – возникла потребность ло-гически связывать свойства объектов, не являющиеся свой-ствами элементов WPF. Основная цель функционального связывания – вычисление и поддержка в актуальном состоя-нии значений, которые не содержатся явно в свойствах объ-екта, но могут быть вычислены на их основе. Например, рас-смотрим класс, описывающий сотрудника. В нем могут быть свойства Фамилия, Имя, Отчество. Заводить отдельное свой- ство для хранения фамилии и инициалов нецелесообразно. Но и вычислять его каждый раз может оказаться неэффек-тивно, разумно хранить результат вычисления и вычислять его только при изменении исходных данных.

Для создания функциональной связи создается цепочка из четырех объектов:

1. Объект-источник. Реализует события со слабыми ссыл-ками о происходящих с ним изменениях.

2. Объект-функция. Этот объект связывается с внешним объектом и вычисляет указанную функцию на основе его свойств. Он обрабатывает указанные события измене-ния внешнего объекта и, при необходимости, обновляет результат вычисления.

3. Объект-установщик. Его задача – установка результата вычисления в свойство другого объекта при изменении значения вычисления.

4. Объект-приемник. Этот объект принимает значение от объекта установщика.

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

///класс-функцияpublic class Function<TV>{ ///конструктор public Function(object target, Func<object, TV> getter) {...} ///свойство для получения вычисленного значения public TV Value {get;} ///событие, уведомляющее об изменении вычисленного значения public IWeakEvent Changed {get;}

///добавление события, по которому выполняется пересчет значения ///выполненное в виде цепного интерфейса public Function<TV> AddEvent(IWeakEvent trigger) {...}}

///класс-установщикpublic class Setter<T>{ ///конструктор public Setter(Action<T> setter, Function<T> src) {...}

}

///статические методы-расширения, для упрощения функционального связывания///и автоматического определения типовpublic static class BindTools{ ///создание объекта-функции public static Function<T2> CreateFunction<T1, T2>(this T1 target, Func<T1, T2> getter) { return new Function<T2>( target, x => getter((T1)x)); }

///создание объекта-установщика public static Setter<T> CreateSetter<T>(this Function<T> func, Action<T> setter) { return new Setter<T>(setter, func); }}

А теперь рассмотрим пример использования такого связы-вания. Использование методов-расширений и цепных интер-фейсов делает код функционального связывания простым и лаконичным.

//модель представления человека, включающая вычисляемое полеclass DisplayPerson{ //конструктор public DisplayPerson(Person p) { Person = p; u

В примерах кода используются материалы статьи (1), посвященной реализации событий с использованием слабых ссылок, опубликован-ной в октябрьском номере журнала MSDeveloper.RU.

Функциональная зависимость

Page 25: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 25

.N ET Framework

//конструируем установщик вычисленного значения _displayNameSetter = //сначала создаем объект-функцию Person.CreateFunction(x => String.For- mat(«{0} {1}.{2}.», x.LastName, x.FirsName.Substring(0, 1), x.Patronymic.Substring(0,1))) //добавляем в него подписки на события .AddEvent(Person.FirstNameChanged) .AddEvent(Person.LastNameChanged) .AddEvent(Person.PatronymicChanged) //а потом конструируем установщик .CreateSetter(x => DisplayName = x); }

//ссылка на исходные данные о человеке public Person Person {get; private set; }

//вычисленное значение свойства имени public string DisplayName {get; private set; }

//установщик значения private Setter<string> _displayNameSetter;

}

//описание человекаclass Person{ //фамилия public string LastName { get; set; }

//имя public string FirsName { get; set; }

//отчество public string Patronymic { get; set; }

//событие изменения фамилии public IWeakEvent LastNameChanged { get; } //событие изменения имени

public IWeakEvent FirstNameChanged { get; } //событие изменения отчества public IWeakEvent PatronymicChanged { get; }}

Автоматические коллекции

Автоматические коллекции – это коллекции, недоступные для прямого изменения, но их содержание автоматически формируется на основе других коллекций по определенным правилам. Содержимое коллекция определяется при ее соз-дании и в дальнейшем может использоваться без необходи-мости повторных вычислений. Экземпляр автоматической коллекции подписывается на события (конечно на слабых ссылках), уведомляющих об изменении исходной коллекции и ее элементов. Если в исходной коллекции что-то изменяет-ся, то одновременно выполняются необходимые изменения в автоматической коллекции. Например, в случае автоматиче-ской сортировки элементов по имени, сортировка выполняет-ся при добавлении-удалении элементов коллекции, а также при изменении имени любого из элементов коллекции. В слу-чае если произошли изменения, автоматическая коллекция генерирует соответствующие события. Это дает возможность объединять автоматические коллекции в сложные взаимос-вязанные конструкции.

Наиболее близкие аналоги автоматических коллекций – кон-струкции Linq и класс CollectionView. Однако между ними есть существенные отличия.

Отличие от Linq

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

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

Отличие от CollectionView

Объекты класса CollectionView по сути очень похожи на автоматические коллекции. Но модели их использова-ния сильно различаются. Collection-View предназначен для создания изме-няемого представления (т. е. правила представления – сортировка и фильтр могут меняться) неизменяемой кол-лекции, в то время как автоматические коллекции предназначены для неиз-меняемого представления (правила не изменяются) изменяемой коллекции. В архитектурном плане существенным отличием является использование в CollectionView событий с сильными ссылками. Т. е. события исходной кол-лекции буду содержать сильные ссыл-ки на связанные с ними экземпляры CollectionView. Это затрудняет ис- пользование этого класса при работе с внешними коллекциями. Так же u

Связанные коллекции

Page 26: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 26

.N ET Framework

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

А теперь рассмотрим виды автоматических коллекций.

Фильтрация и сортировка

Первый вид автоматических коллекций – это практически аналог CollectionView, позволяет создавать коллекции, содержащие элементы, удовлетворяющие определенным правилам и в указанном порядке. Рассмотрим пример кода создания такой коллекции:

// коллекция видимых проектов, отсортированная по имени// Неактивные проекты видны только если свойство // IsShowInactiveProjects = true// активные видны всегдаvar visibleProjects = allprojects.ToAutoProcessed() //создание автоколлекции .FilteredBy(p => IsShowInactiveProjects || p.Is- Active()) //указываем фильтр .SortedOn((p1,p2) => String.Compare(p1.Name, p2.Name)) //указываем функцию сравнения .UpdateOn(IsShowInactiveProjectsChanged) //обновляем при изменении IsShowInactiveProjects .UpdateOn(p => p.StateChanged) //обновляем при изменении статуса проекта .UpdateOn(p => p.NameChanged); //обновляем при изменении имени проекта

Преобразование

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

//коллекция функциональных привязок к названиям проектов var projectNames = visibleProjects .Convert( //создание коллекции-конвертера p => BindTools.CreateFunction(p, x => String.Format(“{0} – {1}”, x.Name, x.State) //задаем функцию-конвертер .AddEvent(p.StateChanged)) //задаем события, по которым нужно обновить привязку .AddEvent(p.NameChanged));

Индексация

Часто необходимо иметь возможность быстро находить элементы коллекции, обладающие определенными свой-ствами. Полный перебор элементов (как это происходит при использовании Linq to objects) может быть неприемлем по соображениям производительности. На помощь приходит автоматическая индексация – словарь элементов исходной коллекции, проиндексированный по указанному ключу, авто-матически обновляемый при изменении исходной коллекции. Например, для создания коллекции индекса коллекции про-ектов по статусу, нужно написать:

//создаем индекс проектов по статусуvar indexByState = visibleProjects .ToIndex(p => p.State) //задаем функцию

для получения ключа .UpdateOn(p => p.StateChanged); //задаем событие изменения ключа

О реализации

Основой реализации всех автоматических коллекций явля-ется шаблонный интерфейс IReadOnlyCollection, описы-вающий методы доступа к коллекции без возможностей ее изменения, и содержащий декларации событий на слабых ссылках об изменении состава коллекции:

public interface IReadOnlyCollection<T> : IEnume-rable<T>, IWeakCollectionEvents, INotifyCollectionChanged, INotifyPropertyChanged{ /// <summary> /// количество элементов коллекции /// </summary> int Count { get; }

/// <summary> /// Проверка на наличие элементов коллекции /// </summary> bool Contains(T item);

/// <summary> /// Получение элемента коллекции по порядковому номеру /// </summary> T this[int index] { get; }}

/// <summary>/// интерфейс событий об изменении коллекций, реализованный на слабых ссылках/// Позволяет подписываться на события об изменении коллекций без удержания /// ссылки на подписчика в объекте-источнике/// </summary>public interface IWeakCollectionEvents{ /// <summary> /// объект добавлен в коллекцию /// </summary> IWeakEvent Added { get; } /// <summary> /// объект удален из коллекции /// </summary> IWeakEvent Removed { get; } /// <summary> /// содержимое коллекции изменено полностью /// </summary> IWeakEvent Reset { get; } /// <summary> /// содержимое коллекции было изменено. /// Это дублирующее событие, генерируется после любого другого /// </summary> IWeakEvent Changed { get; }}

Интерфейс IReadOnlyCollection очень похож на внешний интерфейс класса ObservableCollection. Объекты, реали-зующие IReadOnlyCollection, могут использоваться в каче-стве источников данных для интерфейсных элементов WPF, таких как ListView или TreeView.

Все автоматические коллекции получают в качестве входящей коллекции реализацию интерфейса IReadOnlyCollection и, в свою очередь, тоже реализуют этот интерфейс. Как я уже упоминал, это дает возможность комбинировать различные автоматические коллекции. Для создания начальных коллек-ций – т. е. тех, состав которых можно изменять, предназна-чен класс WeakObservableCollection. Унаследованный от ObservableCollection, этот класс дублирует уведомление u

Page 27: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 27

.N ET Framework

об изменении состава коллекции с помощью событий на сла-бых ссылках.

// <summary>// расширение класса ObservableCollection // дополнительным событием на слабых ссылках, дублирующим события // об изменении базового класса// </summary>public class WeakObservableCollection<T> : Obser-vableCollection<T>

public WeakObservableCollection() { }

protected override void OnPropertyChanged(Proper- tyChangedEventArgs e) { base.OnPropertyChanged(e); RaisePropertyValueChanged(e); }

protected override void OnCollectionChanged(No- tifyCollectionChangedEventArgs e) { base.OnCollectionChanged(e); RaiseContentChanged(e); }

WeakEvent _PropertyValueChanged; // <summary> // Событие изменения свойства коллекции // </summary> public IWeakEvent PropertyValueChanged { get{ return _PropertyValueChanged ?? (_Pro- pertyValueChanged = new WeakEvent(this)); } } private void RaisePropertyValueChanged(EventArgs args) { if (_PropertyValueChanged != null) _PropertyValueChanged.Raise(args); } WeakEvent _ContentChanged;

// <summary> // Событие изменения состава коллекции // </summary> public IWeakEvent ContentChanged { get { return _ContentChanged ?? (_ContentChan- ged = new WeakEvent(this)); } }

private void RaiseContentChanged(EventArgs args) { if (_ContentChanged != null) _ContentChanged.Raise(args); }}

Для получения интерфейса IReadOnlyCollection из WeakOb- servableCollection, предназначен класс-обертка Wrapper-Collection. Этот класс реализует интерфейс доступа IRead-OnlyCollection, скрывая исходную коллекцию:

public class WrapperCollection<T> : INotifyProper-tyChanged, IReadOnlyCollection<T>{ ///внешняя коллекция WeakObservableCollection<T> _coll;

///обработчик события изменения внешней коллекции EventReceiver<NotifyCollectionChangedEvent- Args> _updater;

///обработчик события измнеения свойства внеш- ней коллекции EventReceiver<PropertyChangedEventArgs> _pro- pertyUpdater;

public WrapperCollection(WeakObservableCollec- tion<T> src) { if (coll == null) throw new ArgumentNullException();

_coll = src; _updater = new EventReceiver<NotifyCollecti- onChangedEventArgs>( coll_CollectionChanged);

_coll.ContentChanged.AddReceiver(_updater); _propertyUpdater = new EventReceiver<Proper- tyChangedEventArgs>( coll_PropertyChanged);

_coll.PropertyValueChanged.AddReceiver(_pro- pertyUpdater); } /// Я не привожу исходных кодов остальных методов /// класса, так как они довольно скучны, /// однообразны, занимают много места и не /// критичны для понимания излагаемого материала}

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

Заключение

Использование уведомлений на слабых ссылках дает новые возможности использования паттерна «наблюдатель». Ос-новное преимущество их применения – возможность исполь-зовать сборщик мусора для удаления неиспользуемых под-писчиков. Это дает позволяет конструировать разнообразные расширения для объектов бизнес-модели, такие как функци-ональные привязки и автоматические коллекции.

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

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

Список литературы

1. Б. Л. Романов. «Реализация паттерна Наблюда-тель с использованием слабых ссылок». Журнал MSDeveloper.RU. Октябрь 2011 г.

Page 28: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 28

W indows Azure

АвторАндрей Моор http://www.msdeveloper.ru/blogs/andrew/Microsoft MCP, Microsoft Student Partnerг. Москва

Развертывание приложения Windows Azure средствами Visual Studio 2010

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

Azure SDK, непосредственно из Microsoft Visual Studio 2010.

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

Далее в этой статье мы рассмотрим процесс создания про-стейшего приложения для работы в облаке и его публикацию на портал при помощи Мастера Публикаций (Publish Wizard) прямо из Microsoft Visual Studio 2010. Далее по ходу статьи я не буду употреблять русскоязычные термины типа «Мастер Публикаций», а буду пользоваться их оригинальными ана-логами, в данном случае Publish Wizard, чтобы не вызывать путаницу в переводах и значениях.

Коротко процесс, рассмотренный сегодня, выглядит пример-но вот так:

{ создание проекта, с использованием какого-либо стан-дартного стартового шаблона,

{ вызов Publish Wizard,

{ загрузка регистрационных данных,

{ настройка облачных сервисов,

{ добавление в приложение некоторого функционала,

{ сохранение профиля и публикация решения,

{ настройка удаленного рабочего стола (Remote Desktop),

{ настройка хранилища в облаке,

{ использование веб развертывания для обновления при-ложения,

{ и, наконец, заново «переразвертывание» в стадию production.

Создание приложения

Для начала создадим новый проект, для этого, запустив Visual Studio от имени администратора (конечно работать над проектами не обязательно в режиме администратора, но для выполнения ряда операций нам понадобятся расширенные возможности), выберем в списках шаблонов Web " ASP.NET

MVC 3 Web Application, и шаблон Internet в следующем диа-логовом окне.

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

Дождавшись завершения создания структуры проекта, доба-вим в него проект Windows Azure. Для этого щелкнув правой кнопкой мыши на проекте SimpleAzureWeb, выберем Add Windows Azure Deployment Project. Структура проекта те-перь должна выглядеть следующим образом. u

Page 29: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 29

W indows Azure

Развертывание решения

Теперь приступим к тому, ради чего все это создавалось – к публикации нашего решения. Нажав правой кнопкой мыши на проект SimpleAzureWeb.Azure и выбрав Publish, мы увидим следующий диалог:

Теперь для продолжения нам сначала необходимо получить наши учетные данные, нажмем Sign in to download creden-tials. После этого будет открыто окно стандартного браузе-ра и вам предложат ввести свои учетные данные Windows Live ID. Конечно для того, чтобы пользоваться подпиской она должна иметься, и, введя свои данные, вы будете перена-правлены на страничку, на которой автоматически начнется загрузка конфигурационного файла. Сохраните файл в лег-кодоступное место. Дождитесь окончания загрузки, и в диа-логовым окне, описанном выше, нажмите кнопу Import и вы-берите только что сохраненный файл (*.publishsettings).

После нажатия кнопки Next, будет показан диалог, в котором необходимо выбрать название сервиса (Hosted Service) или создать новый. В нашем примере мы создадим новый сервис и назовем его SimpleAzurePublish. Расположение выберите где вам удобнее всего. Я решил выбрать Anywhere Europe.

После нажатия кнопки OK мы увидим настройки нашей пу-бликации.

Настройки публикации

В выпадающем списке Environment выберем не Production, а Staging, и отметим опции Enable Remote Desktop for all roles и Enable Web Deploy for all web roles.

При выборе Enable Remote Desktop for all roles будет пред-ложено создать аккаунт для использования данной возмож-ности в дальнейшем. В диалоговом окне введите желаемые имя, пароль и срок действия аккаунта.

Все, закончив с основными настройками, перейдем к до-полнительным, для этого перейдите на вкладку Advanced Settings.

Назовем Deployment Label – SimpleAzurePulishing, и созда-дим аккаунт хранилища (Storage Accout) SimpleAzureStorage.

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

На этом все настройки завершены, остается начать развер-тывание проекта, нажав кнопку Publish. u

Page 30: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 30

W indows Azure

Теперь Visual Studio начнет развертывание решения, которое займет некоторое время. А пока мы начнем дорабатывать наш проект. Все изменения, внесенные начиная с текущего момента на сервере, найти будет нельзя, потому что мастер начал публикацию проекта собранного к тому времени как мы нажали кнопку Publish.

Откроем файл Index.cshtml и внесем невероятно существен-ное изменение: вместо теста в параграфе внесем следующее:

@{

ViewBag.Title = «Home Page»;

}

<h2>@ViewBag.Message</h2>

<p>

Чтобы эти изменения вступили в силу, нам пришлось обновить развертывание.

</p>

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

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

22:58:40 - Preparing deployment for Subscription-1 with Subscription ID: 06645578-9615-442f-a125-fa228e4b19c6...

22:58:40 - Connecting...

22:58:41 - Uploading Certificates...

22:59:06 - Verifying storage account ‘simpleazurestorage’...

22:59:07 - Uploading Package...

23:00:08 - Creating...

23:01:46 - Created Deployment ID: eeddda16cac34ffc9263bc5ba220f003.

23:01:46 - Starting...

23:02:22 - Initializing...

23:02:22 - Instance 0 of role SimpleAzureWeb is in an unknown state

23:02:59 - Instance 0 of role SimpleAzureWeb is creating the virtual machine

23:03:34 - Instance 0 of role SimpleAzureWeb is starting the virtual machine

23:05:55 - Instance 0 of role SimpleAzureWeb is in an unknown state

23:06:30 - Instance 0 of role SimpleAzureWeb is busy

23:16:59 - Instance 0 of role SimpleAzureWeb is ready

23:16:59 - Created Website URL: http://eeddda16cac34ffc9263bc5ba220f003.cloudapp.net/

23:16:59 - Creating publish profiles in local web projects...

23:16:59 - Complete.

Проследовав по ссылке, увидим нашу страничку:

Обновление проекта

Но, учитывая, что мы с момента прошлой публикации сдела-ли изменения, придется обновить проект. Для этого нажмем правой кнопкой мыши на проекте SimpleAzureWeb и выбе-рем Publish.

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

Теперь наш проект развернут и находится в состоянии Staging. Если мы провели все необходимое тестирование и отладку проектов, то мы должны перевести его в состояние Production. Это действие абсолютно аналогично сделанным. Нажмем правой кнопкой на проекте SimpleAzureWeb.Azure и выберем опять Publish и при выборе профиля нажмем Manage. Скопировав текущий профиль, всего лишь переиме-нуем его на SimpleAzureProduction и изменим Environment на Production. Теперь все это остается опять опубликовать.

На этом мы рассмотрели механизм развертывания решений Windows Azure при помощи Visual Studio. Как видно, процесс просто элементарный и удобный, если настроить профиль заранее. С удовольствием учту ваши комментарии и заме-чания. n

Page 31: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 31

W indows Azure

АвторАндрей Моор http://www.msdeveloper.ru/blogs/andrew/Microsoft MCP, Microsoft Student Partnerг. Москва

Жизненный цикл проекта Windows Azure при старте

При развертывании решений в облаке, очень часто слу-чается, что без предварительных настроек (может и со-всем несложных), нам не обойтись. Это, как правило,

настройки или надстройки над IIS. Я на личном опыте стол-кнулся с тем, что мне необходимы решения, предлагаемые IIS Media Services, которые не входят по умолчанию в IIS 7.5. Одним из самых простых и интуитивно понятных способов добавить эту функциональность IIS серверу на виртуальной машине в Windows Azure – это вместе с решением поставить IISMedia64.msi, и перед запуском решения произвести уста-новку компонента. Возникает вопрос: как это осуществить не-посредственно перед запуском нашего проекта, ибо в против-ном случае мы столкнемся с тем, что наш проект проросту не будет работать всего лишь из-за отсутствия некоторого сер-верного функционала. Тут нам на помощь приходят Windows Azure Startup Tasks.

Startup Task

Startup Task – это обычный скрипт, которыми мы все при-выкли пользоваться (Command-Line Executable file *.cmd), и на который ссылается файл конфигурации сервиса в проек-те Windows Azure (Cloud Service Definition file *.csdef). После развертывания проекта, компонент Fabric Controller ана-лизирует конфигурационный файл в целях выявления необ-ходимых ресурсов. После этого инициализируется стартовый процесс веб-роли (Role Startup Process).

<?xml version=“1.0” encoding=“utf-8”?><ServiceDefinition name=“WindowsAzureProject1” xmlns= “http://schemas.microsoft.com/ServiceHosting/2008/

10/ServiceDefinition”> <WebRole name=“YourWebRoleName”> <Runtime executionContext=“elevated”> </Runtime> <Sites> <Site name=“Web”> <Bindings> <Binding name=“Endpoint1” endpointNa- me=“Endpoint1” /> </Bindings> </Site> </Sites> <Endpoints> <InputEndpoint name=“Endpoint1” protocol= “http” port=“80” /> </Endpoints> <Imports> <Import moduleName=“Diagnostics” /> </Imports> <Startup> <Task commandLine=“startup.cmd” executionCon- text=“elevated”></Task> </Startup> </WebRole></ServiceDefinition>

Обратим внимание на элемент <Startup>.

<Startup> <Task commandLine=“startup.cmd” executionCon- text=“elevated”></Task></Startup>

Рассмотрим подробнее атрибуты стартовой задачи.

{ CommandLine – это имя файла скрипта, который будет запущен перед началом работы роли.

{ ExecutionContext – определяет уровень разрешений для выполнения задачи. Существует два типа разреше-ния: u

Page 32: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 32

W indows Azure

=Limited – в этом случае скрипт будет выполнен с теми же разрешениями, которые имеет веб-роль.

=Elevated – запуск скрипта с правами администраторами.

{ TaskType – этот атрибут определя-ет, как скрипт будет выполняться: синхронно или асинхронно. Оче-видно, что выполнение синхронных задач займет больше времени, поэтому нужно всегда иметь ввиду длительность установки каких-либо пакетов, так как стартовая задача не может выполняться более, чем 5 минут. Существует три типа за-дачи:

=Simple (Synchronous) – задача запускается, и экземпляр роли заблокирован пока стартовая задача не будет выполнена. В случае если произойдет сбой или некоторая ошибка при выполнении стартовой задачи, роль будет заблокирована и не сможет начать работу.

=Background (Asynchronous) – запускается как старто-вая задача, так и экземпляр веб-роли.

=Foreground (Asynchronous) – стартовая задача за-пускается, но веб-роль не сможет завершить работу, пока стартовая задача не завершится.

Жизненный цикл

Что же происходит с проектом при его развертывании в обла-ке? Схематично процесс выглядит как показано на рисунке.

После того, как мы загрузили наше решение в облако, Fabric Controller начинает поиск нужного аппаратного обеспече-ния в файле конфигурации сервиса (Cloud Service Defenition). Затем, происходит загрузка Guest OS Image и инициализация процесса ее загрузки.

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

Если скрипт имеет синхронный тип, после его выполнения роль переходит на следующую фазу.

Одновременно с событием OnStart, либо спустя несколько мгновений после него, начинает свою работу IISConfigura- tor.exe. IISConfigurator.exe – это процесс, который просматри-вает весь элемент Sites для конфигурации веб приложений, виртуальных каталогов, портов и так далее на IIS.

После того как обработчик события OnStart полностью за-вершил свою работу, роль переходит в состояние Ready, и начинает принимать запросы от балансировщика загрузки. В этот момент срабатывает событие Run, и хоть оно явно и не присутствует в веб-роли, его, тем не менее, можно переопре-делить и организовать некоторую функциональность.

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

Возможные проблемы

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

{ Возможный сбой стартовой задачи.

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

{ IISConfigurator.exe может переписать изменения, произ-веденные вами, в связи с тем, что его запуск произво-дится на этапе, следующим за выполнением стартовых задач.

{ Возможное выполнение наперегонки IISConfigurator.exe и события Startup.

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

Загрузка cspkg + cscng

Аппаратное обеспечение + VM

Запуск стартовых задач

IISConfigurator.exe OnStart

Run

Ready... Recycle

OnStop

Page 33: 12 (04) MSDeveloperRU

Реклама

Page 34: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 34

И нтервью

Интервью с Юлией БелянинойMicrosoft MVP Lead Russia & CIS

Наше досье

Беседовал Станислав Горнаков

В 1996 году окончила филологический факультет Московского Государ-ственного Открытого Педагогического университета.

С 1996 по 2004 год работала системным администратором, а затем руко-водителем IT-департамента в компании Grand Vision (один из крупнейших поставщиков контактных линз и средств ухода за ними).

С 2004 года по 2007 год работала в ритейл-подразделении компании Теле-фон.Ру в должности руководителя IT-департамента головного офиса, затем в должности CIO.

В 2007 году начала карьеру в российском офисе Microsoft на должности MVP Lead, каковую и занимает по настоящее время.

В начале 90-х годов компания Mi-crosoft ввела в обиход статус под названием Microsoft MVP. Аббре-

виатура MVP расшифровывается как Most Valuable Professionals или говоря простым языком – это наиболее цен-ные профессионалы и эксперты в сво-ей области. Статус Microsoft MVP при-суждается сроком на один год и каждый новый год, человек, имеющий данный статус обязан подтверждать это звание своими делами. Кроме этого каждый человек, имеющий определенный вес в сообществе и славящийся своими до-стижениями по линии Microsoft, может претендовать на статус MVP. Чтобы побольше узнать о том кто такие MVP, как в Microsoft ведется работа с MVP и что нужно сделать, чтобы стать MVP, мы решили встретиться с Юлией Бе-ляниной, MVP Lead Microsoft, которая отвечает за это направление в русском представительстве компании.

Станислав Горнаков: Юлия, здравствуйте! Очень рад, что вы согласились дать интервью для журнала MSDeveloper.RU. Юлия, как давно вы работаете

в Microsoft и, как и откуда пришли на эту работу?

Юлия Белянина: В Microsoft я работаю с 2007 года, куда пришла из компании Телефон.Ру, одного из самых ярких и известных брендов на рынке сотового ритейла. В тот момент я приняла для себя стратегическое решение о том, что хочу попробовать работать в Microsoft, т. к. в должности CIO уже принимала участие в масштабных IT-проектах со стороны заказчика, и не видела для себя перспективы развития, которая бы была мне интересна с точки зрения дальнейших шагов в карьере.

В Microsoft сразу начали работать по линии MVP или до текущей должности по-пробовали себя и в других ролях?

Я сразу начала работать в текущей должности, и единственное изменение состоит в том, что в момент прихода в Microsoft Россия эта должность пред-

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

Чем вы конкретно занимае-тесь и что курируете по ли-нии MVP в Microsoft Россия?

По сути я – account manager, только я работаю не с клиентами или партнера-ми, а с представителями сообщества, с лучшими, не побоюсь этого слова, представителями. Что обычно делает account manager? Если исключить ком-мерческую составляющую, каковая в моем случае отсутствует, то останется следующее – поддержка предоставле-ния официальных привилегий, кото-рые доступны участникам MVP Award Program, сопровождение участия MVP в различных проектах для сообществ, решение проблем, возникающих в процессе взаимодействия MVP с ло-кальным офисом или штаб-квартирой в Редмонде, проведение мероприя-тий для MVP, а также привлечение их к работе на наших ключевых конфе-ренциях, таких, как TechEd Russia или DevCon, которые все MVP могут посе-тить абсолютно бесплатно.

Для всех MVP я – главное контактное лицо в Microsoft, и они могут обращать-ся ко мне по любым вопросам, касаю-щимся наших технологий, организации работы с сообществом, продвижения и разработки наших продуктов. В мои обязанности также входит продвиже-ние бренда MVP на территории России. Все вопросы, касающиеся PR и имид-жа MVP Award Program в данном регио-не также находятся в моем ведении. u

?

?

?

Page 35: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 35

И нтервью

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

В целом команда MVP Award Program Russia по составу большая? Кто вам еще по-могает и работает в этом направлении в российском офисе?

В данный момент команда состоит из двух человек – это ваша покорная слу-га и Валерия Полякова, являющаяся моей правой рукой, которая работает в должности координатора MVP Award Program и помогает мне решать непро-стые вопросы, порой возникающие у MVP, а также занимается еженедель-ными рассылками, отправкой пригла-шений на различные мероприятия, которые мы организуем для MVP либо предоставляем им право привилегиро-ванного участия в них, и прочими во-просами, в процессе решения которых может понадобиться помощь в работе с MVP.

Вы работает только с рос-сийскими MVP или ведете это направление и по всем странам СНГ?

Я отвечаю не только за Россию, но и за все страны СНГ за исключением При-балтики.

Сколько у нас MVP по России и по всему СНГ в частности?

На данный момент в регионе 132 MVP, из них 100 – в России, 25 – в Украине, 4 – в Казахстане, 2 – в Беларуси и один в Молдове.

А в целом по миру какова статистика?

В целом в мире более 4000 MVP, про-живающих более чем в 100 странах и говорящих на более чем 40 языках.

Что такого дают эти люди и почему Microsoft очень силь-но ценит своих MVP?

Об этом можно говорить часами, и это-го будет недостаточно, чтобы расска-зать, как именно MVP помогают нам,

что мы получаем от них и каким обра-зом взаимодействуем.

MVP всегда вовлечены в процесс соз-дания наших продуктов еще на этапе их разработки – они получают доступ к бета-версиям продуктов раньше дру- гих, общаются с продуктовыми коман-дами в рамках специальных меропри-ятий, направленных на улучшение качества наших продуктов, различных онлайн-инициатив, доступных только для MVP, а также при помощи специ-ального сервиса MS Connect, ограни-ченно доступного также другим клиен-там и партнерам. О большинстве багов в рамках тестирования продуктов как правило нам сообщают именно MVP. Они же в немалой степени способству-ют продвижению наших продуктов на рынке, их популяризации, и это также неотъемлемая часть результатов их де-ятельности. Поддержка, которую MVP оказывают сообществу, заказчикам и партнерам на волонтерской основе, является поистине бесценной, т. к. за-частую их уровень знаний соответству-ет таковому, а в некоторых случаях и превосходит уровень знаний специ-алистов, работающих в региональных офисах Microsoft по всему миру.

Одним из важнейших постулатов MVP Award Program является тот факт, что MVP – это прежде всего независимые эксперты, свободные в своих суждени-ях и оценках от привязки к точке зре-ния текущего работодателя, так как они не являются сотрудниками Microsoft. Конструктивная критика, которую они предоставляют нам, показывает все ошибки и недочеты, допущенные на-шими разработчиками в процессе ра-боты над тем или иным продуктом, и это помогает нам взглянуть на то, что мы делаем со стороны, услышать на-ших клиентов, конечных потребителей, а во многих случаях последовать их со-ветам.

MVP включены практически во все

сферы нашей деятельности, начиная от мероприятий и заканчивая тестиро-ванием продуктов, с одним единствен-ным ограничением – все, что делают MVP в рамках MVP Award Program, не должно касаться продаж или получе-ния иной коммерческой выгоды от ре-зультатов их деятельности.

В целом, вклад MVP в развитие на-ших продуктов сложно переоценить, и именно поэтому Microsoft высоко це-нит возможность обмена мнениями с лучшими экспертами технического со-общества.

Каким образом происходит обратная связь между MVP и Microsoft?

Как я уже упомянула, обмен мнениями происходит в рамках различных меро-приятий – как offline так и online, при помощи сервиса MS Connect, путем участия в тематических рассылках, до-ступных MVP по каждой экспертизе. Интенсивность такого взаимодействия зависит от потребностей продуктовой команды в получении обратной связи, но в целом ее можно оценить как вы-сокую.

Можно утверждать, что для MVP по некоторым вопро-сам «тайные» двери Microsoft открыты несколько шире, чем для других людей?

Безусловно. Прежде всего, это каса-ется более тесных контактов с разра-ботчиками в Редмонде, среди которых довольно много наших соотечествен-ников а также программистов из других стран СНГ, где широко распространен русский язык. Кроме того, как я уже ска-

?

?

?

?

?

?

?

u

Page 36: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 36

И нтервью

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

Много ли примеров MVP, ко-торые впоследствии устро-ились и успешно работали в компании Microsoft?

За последние 2 года только в том ре-гионе, за который я отвечаю, более 10 человек перешли на работу как в российский офис Microsoft, так и при-соединилось к нашим продуктовым командам в Редмонде. В США этот по-казатель еще выше, но Россия в дан-ном контексте далеко не на последнем месте, как одна из стран с большим по-тенциалом.

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

Есть два ключевых момета, являющих-ся основополагающими для кандида-тов, желающих получить MVP Award. Во-первых, человек, претендующий на это звание должен быть признанным гуру в своей области, экспертом, к мне-нию которого прислушиваются в со-обществе. Во-вторых, такой кандидат должен постоянно делиться знаниями на волонтерской основе – выступать на мероприятиях, отвечать на вопро-сы пользователей в форумах и т. д., и количество таких выступлений и отве-тов должно быть сравнимо с достиже-ниями других кандидатов на получение MVP Award во всем мире. Баланс меж-ду этими двумя составляющими опре-деляет результат процесса номинации.

А есть ли какой-то рецепт или требования, гарантиру-ющие получение MVP? Не знаю, например, написать 1000 сообщений в блоге, 1000 сообщений в форуме или где-то еще. То есть, имеются какие-то четкие критерии отбора кандида-тов для номинации в MVP?

Таких критериев не существует, так как получение MVP Award в каждой кон-кретной экспертизе зависит от многих

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

Кто может предложить но-вую кандидатуру на статус MVP?

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

А сами работники Microsoft могут предлагать кандида-тов на MVP?

Любой сотрудник Microsoft может за-полнить специальную форму на вну-треннем сайте чтобы порекомендовать кандидата на получение MVP Award. В таких случаях в приоритетном порядке рассматриваются заявки от сотрудни-ков групп разработки наших продуктов.

Каким образом в Microsoft происходит та самая за-кулисная процедура оценки кандидата с последующим его награждением или от-казом?

Процедура не настолько закулисная, как это может показаться на первый взгляд. Раз в квартал, в начале номи-национного цикла (циклы начинаются соответственно 1-го января, 1-го апре-ля, 1-го июля и 1-го октября) мы со-бираем заявки кандидатов, желающих продлить свой статус, а также заявки тех, кто претендует на получение MVP Award в первый раз. Каждый кандидат заполняет специальную форму, в кото-рой перечисляются все его достижения за предыдущий календарный год. Да-лее данная форма рассматривается на региональном уровне при участии MVP Award Program Team в регионе, а также, при необходимости, технических спе-циалистов, работающих в региональ-ном офисе страны проживания канди-дата, если таковой офис существует. Оценивается количество активностей, релевантность экспертизе, в которой кандидат желает получить MVP, каче-

ство контента и некоторые другие па-раметры. Далее информация вносится в специальную базу данных, и на сле-дующем уровне ревью проводят наши коллеги из MVP Award Program Team в Редмонде при участии сотрудников из групп разработки наших продуктов. Далее каждая продуктовая группа, ис-ходя из своих стратегических приорите-тов, решает, сколько MVP по данному продукту/технологии достаточно для плодотворного взаимодействия с со-обществом. И вот тут как раз начина-ются те самые различия, о которых я упоминала выше – одна из групп может решить, что им нужно N кандидатов, где в одном случае N= 200, а в другом – N=10, при этом в отборе участвуют как новички, так и те, кто реноминируется уже не в первый раз. Далее из общего количества заявок отбирается TOP-N по каждой экспертизе в соответствии с потребностями продуктовой команды, и именно эти кандидаты получают ста-тус, а остальные заявки отклоняются. Именно поэтому (таковы особенности программы) не существует общего ру-ководства с конкретными цифрами на тему «Как получить MVP Award».

Почему процедура номина-ции на получение MVP Award не является полностью про-зрачной? Возможно, более правильным было бы руко-водствоваться результатами голосования в сообществе, и тогда уже принимать ре-шение о вручении награды.

??

? ?

?

?

?

u

Page 37: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 37

И нтервью

Дело в том, что отношения MVP и Mi-crosoft можно рассматривать как отно-шения компании и (есть такой хороший термин, который сложно корректно перевести на русский язык) individual contributor. Каждый MVP подписывает соглашение о неразглашении конфи-денциальных данных (Non-Disclosure Agreement – NDA), и Microsoft, со своей стороны, не разглашает информацию о MVP без их согласия, в том числе информацию о заслугах, за которые был вручен статус – такова политика Microsoft. Мы оставляем за собой пра-во взаимодействовать с MVP в индиви-дуальном порядке, и это нормальная практика, которую часто используют многие другие компании в отношениях с участниками их специальных про-грамм. В случае, если кандидат, успеш-но получивший Award, хочет поделить-ся этой информацией с сообществом, он, разумеется может это сделать, но это его право – выставлять такую ин-формаци на суд общественности или нет. Данная стратегия является гло-бальной с точки зрения MVP Award Program и применяется во всем мире, вне зависимости от страны проживания MVP.

Существуют ли годовые обя-зательства, по которым MVP Lead должен номинировать как можно больше канди-датов, и получает ли MVP Lead бонусы за количество номинированных кандида-тов в регионе?

Нет, таких обязательств не существует, и каждый MVP Lead руководствуется исключительно соответствием уровня знаний и волонтерских активностей кон- кретного кандидата статусу MVP. Фи-нальное решение о количестве канди- датов, а также о том, получит ли кон-кретный кандидат MVP Award, прини- мается на уровне штаб-квартиры, и ни-

каких бонусов за количество кандида-тов не предусмотрено.

MVP не получают за свой статус каких-то денежных вознаграждений или зарпла-ту, но Microsoft конечно же поощряет таких людей. Ка-кие именно бонусы Microsoft предлагает своим MVP?

Прежде всего, я хотела бы заострить внимание на том факте, что MVP Award Program – это дорога с двусторонним движением. Нельзя сказать, что в рам-ках взаимодействия MVP и Microsoft выгоду получает только Microsoft, не-смотря на то, что никаких материаль-ных бонусов для MVP не предусмотре-но. Люди, которые делятся знаниями о наших продуктах, существовали задол-го до появления MVP Award Program, и в Microsoft просто создали программу поддержки таких волонтеров. Если бы MVP Award Program никогда не суще-ствовало, такие люди все равно бы делились знаниями с теми, кому эти знания нужны, мы же просто стараем-ся создать для них режим наибольшего благоприятствования, помогать им в тех областях, где нужна наша помощь, делиться с ними информацией (во мно-гих случаях – конфиденциальной) и с их помощью делать наши продукты лучше. Поэтому главный бонус MVP Award Program – это возможность вли-ять на будущее наших продуктов, на стратегию их развития, на то, по какому пути движется Microsoft.

В списке бонусов также есть бесплат-ные подписки MSDN и TechNet, три бесплатных обращения в нашу служ-бу поддержки (для России и Украины при поддержке локальных офисов мы предоставляем неограниченное коли-чество support-инцидентов для MVP), это также возможность участия на льготной основе в глобальных и ре-

гиональных конференциях, таких как TechEd и многие другие, а также меро-приятия, которые мы проводим только для MVP – ежегодные конференции MVP Open Days и MVP Global Summit. И если на MVP Open Days приезжают MVP из одного региона (такого, напри-мер, как Россия и СНГ), и у них есть возможность пообщаться друг с дру-гом и с сотрудниками регионального офиса/представительства, то на MVP Global Summit они могут напрямую за-дать вопросы разработчикам, получить ответы, предложить новый функционал или обсудить острые вопросы исполь-зования продукта/технологии Microsoft. MVP Summit – крупнейшая технологи-ческая конференция, которая проходит непосредственно в кампусе Microsoft в Редмонде, и она уникальна с точки зре-ния контентной составляющей – мно-гие участники неоднократно отмечали, что нельзя даже сравнить TechEd с MVP Summit, т. к. именно на последнем предоставляется огромное количество конфиденциальной информации, ко-торой нет в открытом доступе, и она предоставляется на условиях NDA.

Список бонусов включает в себя еще несколько пунктов, таких как, например, Award Gift, или Executive Recognition Letter, возможность использования всемирно известного логотипа MVP на своих визитках, в блогах и на форумах. Их состав периодически меняется, но одно остается неизменным – призна-ние Microsoft, признание сообщества и возможность активного участия в рабо-те над нашими продуктами, настолько активного, насколько оно возможно для человека, не являющегося сотрудни-ком компании – это и есть самый глав-ный бонус для кандидата, получившего MVP Award.

Юлия, большое спасибо за интересное интервью, удачи вам и всего самого наилуч-шего. n

?

?

?

Page 38: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 38

Р азработка

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

АвторАндрей Гордиенков[email protected]://softblog.violet-tape.ru/г. Москва

Уже достаточно давно меня интересует тема CQRS, но пока что все останавливалось на изучении документов, примеров, и самому написать что-то используя подход

CQRS не доводилось. В последние дни работа в этом на-правлении активизировалась с новой силой, и пошлел про-цесс по исследованию инструментов более пригодных для реализации этой концепции. Наверно так повлияла конфе-ренция Patterns’n’Practices, когда на ней объявили, что к кон-цу года команда выпустит гайдлайны по реализации CQRS на практике.

Одной из ключевых вещей является непосредственное по-лучение информации из базы данных без промежуточных программных слоев. Такое получение данных должно быть быстрое и простое. Простое и быстрое. По многочисленным источникам и по результатам сайта ORM Battle был выбран для экспериментов BLToolkit.

Насчет скорости работы есть диаграм-ма сравнения с другими фреймворка-ми на 30 июля 2011 года.

Не могу не вспомнить фразу с презен- тации на NDC2011 по поводу «Kill your ORM», где ведущий высказался в та-ком духе: «Linq2Sql вышел слишком простым и быстрым, поэтому придума-ли EF. Больше абстракций!».

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

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

Возможности BLToolkit

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

По умолчанию не поддерживает. Хотя можно указать маппинг на загрузку, но тогда классы становятся несколько перегру-женными аннотациями. Впрочем, в разрезе CQRS меня не очень интересуют возможности подгрузки связанных данных. u

Page 39: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 39

Р азработка

Связывание данных делается «по соглашениям», и реже «по контракту», то, что называется convention over contract, хотя возможность указать явно таблицу или процедуру существу-ет. Так же есть возможность задать правило, по которому бу-дут конструироваться имена процедур.

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

Подготовка к работе

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

Для создания нам понадобится любая редакция VisualStudio 2010, а так же SQL Server не ниже 2005. По умолчанию в по-ставку BLToolkit как минимум входят драйвера для MS SQL 2005, 2008, Microsoft Access. Впрочем, все чудесно работает и с MS SQL Denali

Скрипт для базы:

create table Person( PersonId uniqueidentifier primary key de- fault newid() ,Name nvarchar(100) not null ,Birth datetime ,Resident bit default 0 ,Gender char default ‘m’ ,Weight int ,Height decimal (3,2)

)go

insert into Person values(newid(), ‘Adam’, ‘01-01-1980’, 0, ‘m’, 80, 1.80)insert into Person values(newid(), ‘Amy’, ‘04-07-1986’, 1, ‘f’, 52, 1.65)

Тестов на скорость не делаем, поэтому хватит и двух записей для разнообразия.

Добавление BLToolkit

Основой для экспериментов будет служить консольное при-ложение. Создаем консольное приложение, обязательно указываем, что работать будем с полным четвертым фрейм-ворком.

При создании по умолчанию, проект будет создан для 4-го клиентского профиля, что нам совсем не подойдет. Если не поменять фреймворк с .Net Framework 4 Client Profile, на .Net Framework 4, то во время компиляции получим такие сообщения:

The referenced assembly «BLToolkit.4» could not be resolved because it has a dependency on «System.Data.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089»

The referenced assembly «BLToolkit.4» could not be resolved because it has a dependency on «System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a»

The referenced assembly «BLToolkit.4» could not be resolved because it has a dependency on «System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

После того, как сменили версию фреймворка, добавляем BLToolkit с помощью NuGet. Открываем консоль Package Ma-nager Console (Tools " Package Manager Console) и вводим там:

PM> install-package bltoolkit

В результате должен появиться текст:

PM> install-package bltoolkitSuccessfully installed ‘BLToolkit 4.1.6’.Successfully added ‘BLToolkit 4.1.6’ to BLToolkitExample.

После добавления ссылки на BLToolkit, собираем приложение и убеждаемся, что все компилируется. Следующим шагом будет создание «бизнес-объекта». Сделаем его для начала максимально похожим на то, что содержится в базе данных.

public class Person { public Guid PersonId; public string Name; public DateTime Birth; public bool Resident; public string Gender; public int Weight; public decimal Height;}

Это было не сложно, далее начнется основная магия.

DataAccessor

Основным классом для работы с BLToolkit является Data-Accessor. Это абстрактный класс и от него будем наследо-ваться для написания своего фасада доступа к данным.

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

Начнем с создания класса, который будет наследован от DataAccessor и так же будет абстрактным. u

Page 40: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 40

Р азработка

using BLToolkit.DataAccess;

public abstract class PersonAccessor : DataAccessor { }

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

Следующим шагом будет создание метода для получения данных из базы. Он так же будет абстрактным.

public abstract List<Person> GetAll();

Придумываем более-менее адекватное название методу, указываем какой тип данных будет возвращать метод. Есте-ственно, что BLToolkit волшебным образом в данный момент не узнает, откуда брать данные. Самый простой способ ука-зать – это воспользоваться атрибутом SqlQuery и написать запрос.

[SqlQuery(“select * from Person”)]public abstract List<Person> GetAll();

Но и это еще не все, осталось сделать главное, сказать как соединяться с сервером и откуда будем брать данные. Это можно сделать как в файле конфигурации, так и в коде.

Конфигурация соединения с базой в конфигурации приложе-ния (app.config):

<?xml version=”1.0” encoding=”utf-8” ?><configuration> <connectionStrings> <add name = “DemoConnection” connectionString = “Server=lethiathan\lcf11ct p3;Database=Test;Integrated Security=true” providerName = “System.Data.SqlClient” /> </connectionStrings></configuration>

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

protected override DbManager CreateDbManager() { var cs = new SqlConnectionStringBuilder { InitialCatalog = “Test”, IntegratedSecurity = true, DataSource = @”LETHIATHAN\LCF11CTP3” };

return new DbManager(new SqlDataProvider(), cs.ConnectionString);}

Остается теперь только получить экземпляр класса PersonAccessor в рабочем коде. Это делается несколько не-обычным способом.

В состав BLToolkit входит специальный класс для создания экземпляров классов типа нашего PersonAccessor:

var pa = TypeAccessor<PersonAccessor>.CreateInstance();

С помощью данного способа вы получаете экземпляр класса PersonAccessor, но он уже не абстрактный. Я так думаю, что во время компиляций исходный абстрактный класс переиме-новывается и с помощью TypeAccessor на его основе строит-ся новый класс в run-time режиме.

Все, после этого можно обращаться к методам нашего клас-са и работать с результатами. Итого:

private static void Main(string[] args) { var pa = TypeAccessor<PersonAccessor>.Create- Instance();

var list = pa.GetAll();

foreach (var p in list) Console.WriteLine(“{0} {1} {2}”, p.Name, p.Birth, p.Resident);

Console.ReadLine();}

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

Заполняются только публичные поля класса. Если Name будет приватным полем или же иметь приватный set, то значение не восстановится из базы.

Сопоставление данных

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

В нашем случае можно написать представление на таблицу Person:

create view vPersonas select PersonId ,Name ,Birth ,Resident ,Gender ,Weight ,Height from dbo.Person

Модифицировать запрос:

[SqlQuery(“select * from vPerson”)]public abstract List<Person> GetAll();

Все будет работать точно так же, как прежде.

Параметры

При использовании атрибута SqlQuery можно передавать в запрос параметры. Что может быть весьма полезно в неко-торых случаях.

Для построения запроса с параметрами можно использовать стандартный синтаксис MS SQL, причем u

Page 41: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 41

Р азработка

имя параметра в запросе должно совпадать с именем параметра в методе.

[SqlQuery(«select * from vPerson where resident = @isResident»)]public abstract List<Person> GetAll(bool isResi-dent);public abstract List<Person> GetAll(bool isResident);

Хранимые процедуры

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

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

create procedure Person_GetOlderThan( @Age int)as set nocount on;

select PersonId ,Name ,Birth ,Resident ,Gender ,Weight ,Height from dbo.Person where datediff(yy,Birth, getdate()) > @Age

Прогоняем процедуру, убеждаемся, что все работает как надо, и переходим к написанию C# кода. Для этого в на-шем абстрактном классе PersonAccessor объявляем новый метод, который будет принимать целочисленное значение возраста в качестве параметра, и возвращать список людей старше указанного значения.

public abstract List<Person> GetOlderThan(int age);

Все! После этого в основной программе можно вызвать метод GetOlderThan() и получить данные.

private static void Main(string[] args) { var pa = TypeAccessor<PersonAccessor>.Create- Instance();

var list = pa.GetOlderThan(30);

foreach (var p in list) Console.WriteLine(“{0} {1} {2}”, p.Name, p.Birth, p.Resident);

Console.ReadLine();}

Все дело в принятых соглашениях по названию процедур. На-верно вас сразу насторожило название процедуры в базе и название метода в классе.

По умолчанию, BLToolkit формирует имена про-цедур из имени шаблонного класса и названия метода: %имя_шаблона%_%имя метода%.

Однако такое поведение можно переопределить в классе до-ступа к базе.

Если бы у нас было корпоративное правило, по которо-му все процедуры должны называться, используя префикс sp_, это можно было бы легко реализовать. Для этого в классе PersonAccessor надо переопределить метод Get-DefaultSpName.

protected override string GetDefaultSpName(string typeName, string actionName) { return typeName == null ? actionName : string.Format(“sp_{0}_{1}”, type- Name, actionName);}

Для чистоты эксперимента проверяем, что в базе не осталось исходной процедуры, а только sp_ Person_GetOlderThan. Запускаем приложение и видим, что все работает отлично.

В более хардкорных случаях, когда в вашей организации процедуры принято кодировать и настоящее имя процедуры выглядит примерно так: sp_prsn_get_oldr – будет очень не сладко использовать такое имя в коде. В этом случае можно использовать атрибут SprocName.

[SprocName(“sp_prsn_get_oldr”)]public abstract List<Person> GetOlderThan(int age);

Несмотря на перегруженный метод GetDefaultSpName, код отработает как ожидалось, так как применение атрибутов имеет более высокий приоритет, что логично.

Параметры

BLToolkit сопоставляет параметры метода и процедуры по именам, поэтому не имеет значения в каком порядке вы объ-явили переменные. Допустим, процедура принимает 3 пара-метра

create procedure Person_GetOlderThan( @Age int, @SomeOtherParam nvarchar(100), @Weight int)as

… u

Page 42: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 42

Р азработка

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

public abstract List<Person> GetOlderThan(string someOtherParam, int age, int weight);

Если же и имена параметров никак вас не устраивают, то можно написать код вручную, который по идее генерируется на лету во время исполнения.

public List<Person> GetOlderThan(string text, int age, int weight) { using (var db = GetDbManager()) { return db .SetSpCommand(“Person_GetOlderThan”, db.Parameter(“@someOtherParam”, text), db.Parameter(“@age”, age), db.Parameter(“@weight”, weight)) .ExecuteList<Person>(); }}

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

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

Linq

Согласитесь, что писать запросы перед методом не очень хорошо, тем более, когда есть еще дополнительные условия для фильтрации. Лучше всего обратиться к Linq, раз уж су-ществует такая возможность.

Для начала работы с Linq и указанию BLT на то, какие та-блицы/представления будут участвовать в запросах, надо создать новый класс и наследовать его от DbManager.

public class BltLinq : DbManager {}

Далее надо создать конструктор, который либо будет указы-вать на строку соединения в конфигурации, либо задавать ее самостоятельно (всего конструкторов 5+), например, так:

public class BltLinq : DbManager { public BltLinq() : base(new SqlDataProvider(), @”Data Source=LETHIATHAN\LCF11CTP3;Initial Catalog=Test;Integrated Security=True”) {}}

После этого можно создать свойство, которое будет возвра-щать тип Table, реализующий интерфейс IQueryable.

public class BltLinq : DbManager { public BltLinq() : base(new SqlDataProvider(), @”Data Source=LETHIATHAN\LCF11CTP3;Initial Ca- talog=Test;Integrated Security=True”) {}

public Table<Person> Persons { get { return GetTable<Person>(); } }}

После этих несложных манипуляций можно писать запросы к таблице Person. Например:

using (var db = new BltLinq()) { var query = db.Persons;

foreach (var employee in query) {

Console.WriteLine(“{0} {1}”, employee.Name, employee.Birth); }}

Или

using (var db = new BltLinq()) { var query = from person in db.Persons where person.Weight < 55 select person;

foreach (var employee in query) { Console.WriteLine(“{0} {1}”, employee.Name, employee.Birth); }}

Это выглядит уже лучше, можно добавлять условия и изме-нять переменную типа IQueryable, в процессе выполнения программы добавляя новые условия фильтрации, если нуж-но.

Сгенерированный запрос в процессе выполнения второго примера:

-- Sql MsSql2005SELECT [person].[PersonId], [person].[Name], [person].[Birth], [person].[Resident], [person].[Gender], [person].[Weight], [person].[Height]FROM [Person] [person]WHERE [person].[Weight] < 55

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

[TableName(«vPerson»)]public class Person { ...}

Связанные таблицы

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

Относительно CQRS, данный функционал по идее не должен применяться, однако это может оказаться полезным. Выгля-дит это не очень красиво в коде, ну да ничего с этим не по-делаешь.

Итак, дополним базу данных адресами наших знакомцев.

create table Address( AddressId uniqueidentifier primary key de- fault newid() ,Country nvarchar(100) ,Region nvarchar(100) ,City nvarchar(100) ,Street nvarchar(100) u

Page 43: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 43

Р азработка

,Residence nvarchar(100) )

alter table Person add AddressId uniqueidentifieralter table Person add constraint fk_address2per-son foreign key (AddressId) references Address(Add-ressId)go

insert into Address values(newid(), ‘Russia’, ‘N.Novgorod’, ‘N.Novgorod’,’Minina’, ‘1A’)insert into Address values(newid(), ‘Russia’, ‘Msk’, ‘Msk’, ‘Lenina’, ‘40 - 123’)

update Person set Person.AddressId = Address.AddressId from Address where city = ‘Msk’ and Name = ‘Adam’

update Person set Person.AddressId = Address.AddressId from Address where city <> ‘Msk’ and Name = ‘Amy’

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

public class Address { public Guid AddressId; public string Country; public string Region; public string City; public string Street; public string Residence;}

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

public class Person { public Guid PersonId; public string Name; public DateTime Birth; public bool Resident; public string Gender; public int Weight; public decimal Height;

public Address Address;}

Для установления связи, необходимо воспользоваться атри-бутом Association. В параметрах указываются ключи связи и индикатор, возможно ли значение null у связываемой та-блицы.

public class Person { public Guid PersonId; public string Name; public DateTime Birth; public bool Resident; public string Gender; public int Weight; public decimal Height;

public Guid AddressId;

[Association(ThisKey=”AddressId”, OtherKey=”Add- ressId”)] public Address Address;}

Обязательно при этом добавить поле ключа связи – Address-Id, иначе ничего работать не будет.

Далее в класс BltLinq добавляем свойство для доступа к таблице Address, по образу и подобию того, как мы сделали ранее для Person. После чего можно использовать свойство в построении запросов. Но и тут есть нюансы. Например, возьмем старый код, который уже использовали для получе-ния списка людей с весом меньше 55, и посмотрим в дебаге, заполнилось ли поле Address.

Члены класса, к которым применена ассоциация, не заполняются автоматически при чтении объ-екта из базы данных целиком.

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

using (var db = new BltLinq()) { var query = from person in db.Persons where person.Weight < 55 select new Person(person) { Address = person.Address };

foreach (var employee in query) { Console.WriteLine(“{0} {1}”, employee.Add- ress.City, employee.Name); }}

Заключение

Это можно считать вводным курсом в BLToolkit. Фреймворк предоставляет еще множество настроек и возможностей по оптимизации запросов и получению именно того, что вам тре-буется. Так же поддерживается запись и обновление строк в таблицах. Но об этом как-нибудь в другой раз, когда придет необходимость в этом.

По BLToolkit много материала в сети, так как это уже не новый фреймворк, с большой армией поклонников.

В целом мне понравилось работать с BLToolkit, оставляет приятное впечатление. Буду использовать. n

Page 44: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 44

Р азработка

Облегчаем работу с JS- и CSS-кодом в Visual Studio

АвторАндрей Тарицын www.taritsyn.ru Веб-разработчикMCPD Web Developer, BMSTU JavaScript Specialist, BMSTU Web Page Authoring Specialist, Google Analytics IQг. Москва

С появлением AJAX и веб-прило-жений подобных Gmail, значи-тельная часть логики и пользо-

вательского интерфейса приложения стала реализовываться на JavaScript. Популярность семантической HTML-верстки способствовала тому, что роль CSS в создании пользовательского интерфейса веб-приложений серьезно возросла.

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

Уже в Visual Studio 2008 были внесены кардинальные изменения в редакторы JavaScript- и CSS-кода, направленные на увеличение продуктивности работы веб-разработчика. В данной статье я расскажу о способах, с помощью кото-рых можно сделать работу в этих ре-дакторах еще более продуктивной.

Включаем поддержку IntelliSense для библио-тек, используемых в JS-файлах

При вынесении JavaScript-кода во внеш- ние файлы, у нас пропадает поддержка IntelliSense для JS-библиотек, которые используются в коде. Это происходит потому, что в коде JS-файла отсутству-ют явные ссылки на библиотеки.

Начиная с Visual Studio 2008, в редак-тор JS-кода была добавлена поддерж-ка документирующих комментариев JavaScript во многом похожих на доку-ментирующие комментарии XML в C#. Помимо стандартных документирую-щих тегов (summary, param, returns и value) в набор документирующих комментариев JavaScript был включен тег reference. Данный тег позволяет

добавить в JS-файл ссылку на библио-теку, которая находится в другом внеш-нем JS-файле, и тем самым сообщить Visual Studio о необходимости включе-ния поддержки IntelliSense для данной библиотеки:

/// <reference path=«MyScript.js» />

Также можно ссылаться на скрипты, размещенные в сборках как встроен-ные ресурсы:

/// <reference name=«MyEmbedded-Script.js» />

/// <reference name=«MyEmbedded-Script.js» assembly=«MyAssembly» />

При использовании тегов reference нужно учитывать следующие моменты:

1. Объявление тегов reference должно предшествовать любому другому содержимому (даже обыч-ным комментариям).

2. Ссылки на библиотеки должны быть объявлены в порядке за-висимости, т. е. ссылки на базовые библиотеки должны находиться выше. u

Рис. 1. Пример использования тегов reference для добавления ссылок на библиотеки

Рис. 2. Поддержка IntelliSense для jQuery-плагинов, подключенных с помо-щью тегов reference

Page 45: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 45

Р азработка

3. При указании расположения файла библиотеки можно использовать пути относительно корня приложе-ния (начинаются с ~/) .

4. При указании ссылок на Microsoft-Ajax.js, MicrosoftMvcAjax.js и Micro- softMvcValidation.js можно не ис-пользовать имена файлов вида MicrosoftAjax.debug.js. Среда раз-работки сама найдет debug-версию библиотеки.

5. Visual Studio поддерживает добав-ление ссылок на библиотеки путем простого перетаскивания JS-файла из Solution Explorer в окно редакто-ра JavaScript-кода.

Разбиваем код на регионы

Очень часто количество строк кода в одном файле становится настолько большим, что в нем становится сложно ориентироваться (особенно это харак-терно для CSS-файлов). Такой файл можно разделить на несколько отдель-ных файлов, но не всегда такой под-ход уместен. В некоторых случаях код лучше разделить на регионы, которые можно сворачивать/разворачивать (как в C# при использовании директив #region и #endregion).

Текущие версии Visual Studio не поддер-живают такую возможность, но ее можно добавить, если установить VS-расши- рение VisualStudio 2010 JavaScript & CSS Outlining, разработанное Велио Ивановым (Velio Ivanov). Данное рас-ширение можно загрузить с сайта Visu-al Studio Gallery или со страницы про-екта на CodePlex.

Для JavaScript существует два вариан-та написания директив начала и окон-чания региона:

//#region Вариант 1

…//#endregion

или

//#> Вариант 2…//#<

Для CSS также существует два вариан-та написания:

/*#region Вариант 1 */ …/*#endregion*/

или

/*#> Вариант 2 */…/*#<*/

Рекомендую в CSS-коде использовать первый вариант написания региона, т. к.

этот синтаксис поддерживает CSS-ре-дактор из Visual Studio 11 Developer Pre- view. Возможности CSS-редактора из новой студии подробно описаны в ста-тье Дмитрия Андреева «Новые возмож-ности редактора CSS в Visual Studio 11 Developer Preview».

Текущая версия VisualStudio 2010 Java-Script & CSS Outlining, имеющая номер 2.0, у меня работала с ошибками, по-этому я рекомендую пока использовать версию 1.2. Единственное отличие вер-сии 2.0 от 1.2 заключается в том, что новая версия поддерживает два до-полнительных варианта написания ре-гионов в JavaScript (с использованием многострочных комментариев).

***

Очень многие .Net-разработчики при работе с JavaScript- и CSS-кодом чув-ствуют себя «не в своей тарелке». Чаще всего это происходит не из-за нехватки знаний о технологиях, а из-за отсут-ствия в среде разработки некоторых средств повышающих продуктивность написания кода (IntelliSense, возмож-ность разделения кода на регионы и т. д.). Также стоит отметить, что вряд ли мы когда-нибудь увидим в редак-торах JavaScript-кода полноценный In-telliSense (как в C# или VB.NET), пото-му что JavaScript – это скриптовый язык с динамической типизацией. n

Рис. 3. Пример использования регионов в JavaScript

Рис. 4. Пример использования регионов в CSS

Ссылки

1. The format for JavaScript doc comments

2. JScript IntelliSense in Visual Studio Orcas

3. JScript IntelliSense: A Reference for the «Reference» Tag

4. Документация к VS-расширению VisualStudio 2010 JavaScript & CSS Outlining

Page 46: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 46

.N ET

1C.Net:Предприятие

использование диаграмм .Net Framework 4 на веб-страницах и 1С:Предприятие 8.2

АвторСергей Карташев http://www.1centerprise.com/dotnet/[email protected]

Статья помогает встраивать элементы управления WPF и WinForms на веб-страницы через новую версию Elisy .Net Bridge 4.0. При этом весь набор инструментов .Net

framework становится доступным из скриптов Java Script, по-зволяя создавать .Net-объекты и обращаться к их свойствам и методам, а также организовывать обратную связь и обра-батывать события в коде Java Script. В отличие от Silverlight и XBAP, разработчик не ограничен в выборе средств разра-ботки, а ограничен только браузером Internet Explorer – един-ственным популярным браузером, поддерживающим ActiveX.

Умение проигрывать элементы управления .Net Framework на веб-страницах, необходимо для подключения в новую вер- сию 1С:Предприятие 8.2 диаграммы из .Net framework 4.0 или любых других визуальных компонентов. Так случилось, что именно в «тонком» клиенте 1С 8.2 перестали поддерживать-ся ActiveX-компоненты, и единственным способом подклю-чать свои визуальные компоненты остается браузер Internet Explorer.

Подключение .Net framework на веб-страницы нужно исполь- зовать с особой осторожностью, так как все «опасные» опе-рации, например, запись и чтение в файлы, работа с реест-ром, доступны из скриптов HTML-страницы.

WPF внутри веб-страниц

.Net framework пришел на веб-страницы в форме Silverlight, а еще раньше в форме XBAP. Технология XBAP так и не полу-чила распространение и не сможет в будущем конкурировать с Silverligth. Silverlight несет в себе много достоинств: малый размер дистрибутива, поддержка множества браузеров, но вместе с тем вводит и множество ограничений (некоторые про- диктованы заботой о безопасности) по сравнению с традици-онным .Net framework. Например, все классы .Net framework в Silverlight недоступны, в том числе все визуальные WinForms классы.

Elisy .Net Bridge предлагает третий подход, когда на html-страницы Internet Explorer встраивается весь традиционный .Net Framework 4.0, который не ограничен классами Silverlight, но поддерживается только на IE-браузерах. Знакомый мно-гим WPF-пример часов будет выглядеть как на изображении.

В коде по инициализации примера нет ничего сложного. На html-странице через код:

<object id=«hwndHost» classid=«clsid:B8369982-4974-4F9B-8F4E-1E7EA759A3C1»></object>

Вставляется ActiveX-контрол Elisy .Hwnd Host, к которому об-ращается второй скрытый компонент Elisy .Net Bridge-объ-ект. Elisy .Net Bridge отвечает за создание .Net-объектов и обращение к их свойствам и методам через JavaScript. На страницу он вставляется следующим образом:

<object id=«netBridge» classid=«clsid:D38FA118-057A-49EE-ABBB-D4A7C499F895» style=«visibility: hidden;»></object>

Код инициализации примера с часами приведен ниже:

function onLoaded() { hwndHostObject = document.getElementById(“hwnd- Host”);

net = document.getElementById(“netBridge”);

net.LoadAssembly(“PresentationCore, Versi- on=3.0.0.0, Culture=neutral, PublicKeyToken= 31bf3856ad364e35”);

//Получение на основе числового значения pHwnd объекта IntPtr hwnd = net.New(“System.IntPtr”, hwndHostOb- ject.Hwnd);

//Формирование параметров, необходимых для инициализации объекта HwndSource sourceParams = net.New(“System.Windows.Inter- op.HwndSourceParameters”, “ElisyHwndHost”); u

Page 47: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 47

.N ET

sourceParams.AdjustSizingForNonClientArea = true; sourceParams.ParentWindow = hwnd; sourceParams.WindowStyle = 268435456 + 1073741824; //WS_VISIBLE | WS_CHILD;

//Получение объекта HwndSource, отвечающего за подключение WPF к Hwnd hs = net.New(“System.Windows.Interop.Hwnd- Source”, sourceParams); hs.SizeToContent = net.New(“System.Windows.Size- ToContent”).WidthAndHeight;

clockAssembly = net.LoadAssemblyFrom(“I:/229- net8.2/Elisy.Samples.WpfClock.dll”); clockWpfControl = net.New(“Elisy.Samples.Wpf- Clock.Clock”);

//Показ элемента управления WPF hs.RootVisual = clockWpfControl;

clockWpfControl.Width = 200; clockWpfControl.Height = 200;

resizeControl(hwndHostObject.style.pixelWidth, hwndHostObject.style.pixelHeight);}

Любой WPF-элемент управления может быть подключен ана-логичным образом. WinForms-контролы подключаются через посредник – WindowsFormsHost-класс.

Обзор элемента управления построения диаграмм Microsoft Chart

В состав .Net framework 4 включен новый элемент управле-ния построения диаграмм Chart Control. Это мощный инстру-мент, где за основу взят зрелый компонент сторонних разра-ботчиков Dundas. Работает компонент как внутри WinForms (WPF), так и в составе Asp.Net.

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

ления DotNetCharting, является неперспективным.

Рабочая область диаграммы состоит из более чем 10 визу-альных элементов, каждый из которых доступен через API. API – объектно-ориентированный, расширяемый и гибкий.

В Интернете вы сможете найти и скачать приложение-гале-рею с 200 интерактивными примерами, которое наглядно демонстрирует возможности визуального компонента. Дан-ное приложение поставляется разработчиками как VS2010-проект и может быть скачано с сайта Microsoft. В галерее приведен исходный код на C# и VB.Net. Для удобства раз-работчиков это приложение было скомпилировано и выложе-но в блоге richmedia.us. Для запуска необходимо установить .Net Framework 4, распаковать архив и запустить приложение WinFormsChartSamples.exe. Галерея сильно экономит время на поиск необходимых вашему приложению возможностей.

Ниже приведены несколько скриншотов из интерактивной галереи, демонстрирующих поистине безграничные возмож-ности элемента управления построения диаграмм MS Chart Control. u

Page 48: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 48

.N ET

Диаграммы MS Chart внутри 1С:Предприятие

1С:Предприятие включает в себя ин-струменты построения диаграмм, но ди-аграммы из .Net framework нагляднее, гибче и функционально шире, а видов .Net-диаграмм значительно больше.

Суть вставки диаграмм на форму 1С сводится к следующему. На форму 1С вставляется ActiveX-элемент управле-ния Elisy .Hwnd Host. В случае с 1C вер-сии 8.1 этот элемент вставляется сразу на форму, а в случае с 1С версии 8.2 – через посредник в лице Internet Explorer (IE). Браузер IE позволит одинаковым образом отрисовать форму и в режи-ме «тонкого» клиента, и в режиме веб-клиента. Далее через второй объект Elisy .Net Bridge происходит создание .Net-объектов диаграммы и настройка их свойств.

В связи с тем, что текущей версией 1С является 8.2, нет не-обходимости в статье останавливаться на более старой вер-сии 8.1. В простейшем случае управляемая форма 1С:Пред-приятие 8.2 будет состоять всего из одного реквизита типа строка _html и одного элемента ПолеHTML со свойством Вид равное «Поле HTML документа» и путем к данным _html.

При создании на сервере реквизит _html инициализируется html-кодом из макета «МакетHTML».

&НаСервереПроцедура ПриСозданииНаСервере(Отказ, Стандартная-Обработка)

ВнешняяОбработка = РеквизитФормыВЗначе- ние(«Объект»); HtmlСтрока = ВнешняяОбработка.ПолучитьМа- кет(«МакетHTML»).ПолучитьТекст(); _html = HtmlСтрока; КонецПроцедуры

МакетHTML – это полноценная html-страница, содержащая элемент Elisy .Hwnd Host, функции обращения к этому эле-менту и изменения размеров согласно общему размеру стра-ницы. Код предусматривает показ информации о необходи-мости установить Elisy .Net Bridge, если он не установлен.

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”><html xmlns=”http://www.w3.org/1999/xhtml”><head> <title>Пример Elisy .Net Bridge</title></head><body style=”margin: 0; width: 100%;”> <script type=”text/jscript”> var wpfControl;

function SetWpfControl(control) { wpfControl = control; } function GetWpfControl() { return wpfControl; u

Page 49: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 49

.N ET

}

function resizeControl(width, height) { if (wpfControl != null) { wpfControl.Width = width; wpfControl.Height = height; } }

</script> <div style=”width: 100%; height: 100%;”> <object id=”hwndHost” classid=”clsid:B8369982-4974-4F9B-8F4E-1E7EA759A3C1” style=”width: 100%; height: 100%;”> <div style=”width: 200px; height: 200px; overflow: scroll;”> <p> To proceed further you should install Elisy .Net Bridge 4 SDK. See more at <a href=”http: //www.1centerprise.com/dotnet/” style=”text-decoration: none;”>www.1centerprise.com/dotnet</a> </p> <p> Для работы необходимо установить Elisy.Net Bridge 4 SDK. Более подробно - на сайте <a href=”http://www.1centerprise.com/dotnet/” style=”text-decoration: none;”>www.1center- prise.com/dotnet</a> </p> </div> </object> </div> <script for=”hwndHost” event=”SizeChanged(width,height)”> resizeControl(width, height); </script></body></html>

При открытии формы создается объект Elisy .Net Bridge 4.

&НаКлиентеПроцедура ПриОткрытии(Отказ) //Подключение внешнего компонента ПодключитьВнешнююКомпоненту(«Elisy.NetBridge4»); AddIn = New(«AddIn.ElisyNetBridge4»); net = AddIn.GetNet(); КонецПроцедуры

Код по созданию и отрисовке диаграммы помещен в обработчик события ДокументСформирован элемента ПолеHTML. Работу этого обработчика можно описать так. ActiveX-элемент Elisy Hwnd Host предоставляет свойство HWND, за которое «цепляет-ся» объект-посредник между hwnd-окна и WPF: System.Windows.Interop.HwndSource. В HwndSource вставляется WPF объект ContentControl с другим WPF-объектом WindowsFormsHost – посредником между WPF и WinForms. А в WindowsFormsHost вставляется сама диаграмма Chart. Ниже представлен XAML.<ContentControl xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” xmlns:wfh=”clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration” xmlns:mscharts=”clr-namespace:System.Windows.Forms.DataVisualization.Charting;assembly=System.Win- dows.Forms.DataVisualization” Height=”500” Width=”800”> <Grid> <wfh:WindowsFormsHost> <mscharts:Chart x:Name=”DotNetChart1” BackColor=”WhiteSmoke” BackGradientStyle=”TopBottom” BackSecon- daryColor=”White” BorderlineDashStyle=”Solid” BorderlineWidth=”2” /> </wfh:WindowsFormsHost> </Grid></ContentControl> u

Page 50: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 50

.N ET

Код построения диаграммы может быть любым. В данном примере код 1С был получен на основе C#-кода из галереи, упомя-нутой в предыдущем разделе статьи. Смысла публиковать 70 строк неинтересного кода инициализации нет, поэтому приведен только его фрагмент для ознакомления.

//Горизонтальная диаграммаchart1 = window.FindName(“DotNetChart1”);chartTitle = chart1.Titles.Add(“Горизонтальная диаграмма”);SetTitleStyle(chartTitle);chart1.BorderlineColor = net.CallStatic(“System.Drawing.Color”, “FromArgb”, 26, 59, 105);chart1.BorderSkin.SkinStyle = net.New(“System.Windows.Forms.DataVisualization.Charting.BorderSkinStyle”).Emboss;chartArea1 = net.New(“System.Windows.Forms.DataVisualization.Charting.ChartArea”);chartArea1.Area3DStyle.Enable3D = true;chartArea1.Area3DStyle.Inclination = 15;chartArea1.Area3DStyle.IsRightAngleAxes = false;chartArea1.Area3DStyle.PointDepth = 200;chartArea1.Area3DStyle.Rotation = 10;chartArea1.Area3DStyle.WallWidth = 0;chartArea1.AxisX.LabelStyle.IsEndLabelVisible = false;chartArea1.AxisX.LineColor = net.CallStatic(“System.Drawing.Color”, “FromArgb”, 64, 64, 64);chartArea1.AxisX.MajorGrid.LineColor = net.CallStatic(“System.Drawing.Color”, “FromArgb”, 64, 64, 64);chartArea1.AxisY.IsLabelAutoFit = false;chartArea1.AxisY.LabelStyle.Format = “dd MMM”;chartArea1.AxisY.LineColor = net.CallStatic(“System.Drawing.Color”, “FromArgb”, 64, 64, 64);

Код устанавливает заголовки, определяет стили границ, областей, осей, подписей, определяет типы входящих данных. Далее загружаются сами данные в методе LoadData (примерно, 140 строк кода). Здесь приведен только фрагмент 1С-кода.

ser = chart1.Series.get_Item(0);pos = 1;lastValue = «»;For i = 0 to start.Length-1-1 do

xValue = task.GetValue(i); if lastValue <> xValue then pos = pos + 1; endif;

yValues = «» + (dStartDate+start.GetValue(i))+»,»+(dStartDate+end.GetValue(i)); yValues = СтрЗаменить(yValues, Символы.НПП, «»); pt = net.New(«System.Windows.Forms.DataVisualization.Charting.DataPoint», pos, yValues); pt.AxisLabel = xValue; ser.Points.Add(pt);

lastValue = xValue;EndDo;

Заключение

Статья позволяет на веб-страницы под управлением брау-зера Internet Explorer встроить любой визуальный элемент управления .Net Framework. Пример приводится на основе WinForms-элемента управления построения диаграмм из .Net 4.0. Недостатком WinForms компонентов может считать-ся необходимость в лишнем посреднике-преобразователе между WinForms и WPF. Любителям WPF-диаграмм можно посоветовать обратить внимание на проект WPF Dynamic Da-ta Display.

Диаграммы MS Charts, о которых идет речь в статье, превос-ходят родные диаграммы 1С:Предприятие своей наглядно-стью, гибкостью, разнообразием. Интерактивно оценить пе-речисленные преимущества, вы можете, воспользовавшись галереей.

Статья дает представление о том, как запустить на 1С:Предприятие 8.2 любой самописный ActiveX-элемент. В новой версии 1C такая операция выполняется сложнее в свя-зи с отсутствием поддержки ActiveX на управляемых формах.

Метод использования .Net framework на веб-страницах, опи-санный в статье, не лишен недостатков. Первым недостатком может считаться совместимость только с одним браузером Internet Explorer. Метод не подойдет для использования в дру-гих браузерах, например, FireFox. Необходима также допол-нительная настройка безопасности – включение возможности использования ActiveX-элементов управления. Подключение .Net framework на html-страницы нужно использовать с осо-бой осторожностью, так как все «опасные» операции, напри-мер, запись и чтение в файлы, работа с реестром, доступны из JavaScript-скриптов веб-страницы. n

Page 51: 12 (04) MSDeveloperRU

Рекл

ама

Команда журнала MSDeveloper.RU ищет авторов для написания различных статей, обзоров, превью и других материалов по тематике Microsoft. Если вы любите Microsoft, умеете красиво излагать свои мысли на бумаге, являетесь блогером или только, только начинаете пробовать себя в этом жанре, то обязательно свяжитесь с нами по электронной почте: [email protected] В качестве темы письма используйте заголо-вок «Статья для журнала».

Какие темы нам интересны:

n Тематические статьи;

n Обзоры новостей;

n Технические статьи;

n Обзоры железа;

n Программирование;

n Использование инструментов и технологий Microsoft;

n Материалы для Интервью;

n Качественные фоторепортажи;

n Обзоры мероприятий;

n Эксклюзивы и сенсации;

n И многое другое.

Page 52: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 52

И нтервью

Интервью с Марией ХрузинойMicrosoft Student Partner

Беседовал Станислав Горнаков

Наше досье

?

В 2001 - 2004 участница районных и Московских Олимпиад по изобразительному искусству. В 2004 - 2007 успешно прошла курс заочной школы МИФИ (Московский инженерно-физический институт) по общеобразова-тельному курсу (в том числе 2006-2007 год – курс Информатики).С 2007 года обучается в Московском государственном университете приборостроения и информатики (МГУПИ).С 2007 года является активным участником студенческого совета самоуправления МГУПИ.В 2007 году являлась участницей «Школы Актива».В 2007 - 2008 году участвовала в московской «Школе Лидерства», организованной департаментом семейной и молодежной политики.В 2010 году являлась участником спартакиады по компьютерному многоборью среди школьных и студенческих программ «IT students e-cup».С 2010 года является Microsoft Student Partner и лидером User Group в МГУПИ.С 2011 года занимается хоровым пением. В 2011 году вручено письмо от мэра города Москва с благодарностью за добросовестный труд, самоотдачу и высокий профес-сионализм.В 2011 проводила демонстрацию школьникам из Санкт-Петербурга в главном офисе Microsoft Rus.Является активным участником, организатором и докладчиком на студенческих конференциях.Имеет несколько публикаций в университетском издании. Участница различных конференций, а также городских и университетских мероприятий.Живет и обучается в Москве.

Станислав Горнаков: В пре-дыдущем ноябрьском номе-ре журнала у нас в гостях побывала Яна Куранова, Microsoft Student Partner. Мы решили развить эту тему и в декабрьском номере жур- нала. Сегодня у нас в гостях еще одна девушка Мария Хрузина, она также является Microsoft Student Partner. Ма- рия, приветствую вас на страницах журнала MSDeve-loper.RU! Мария, расскажите, пожалуйста, откуда вы узна- ли о программе MSP и почему решили в ней участвовать?

Мария Хрузина: Здравствуйте, Стани- слав и уже сильно полюбившийся жур-

нал MSDeveloper.RU. Очень приятно с вами общаться. О программе Microsoft Student Partner я узнала уже на первом курсе, т. к. с Microsoft наш вуз начал со-трудничать еще до моего поступления. У нас уже были MSP в вузе, и что стоит отменить, замечательные, умные ребя-та, которые на данный момент доби-лись весьма достойных высот. Это Ан-тон Алешкин, Сергей Лесько, Алексей Гусаров и Сергей Пугачев (Microsoft) – они привели меня в большой и бес-крайний мир технологий Microsoft. На первом курсе я еще не все понимала в том, что рассказывали ребята, но было безумно интересно. Я не жалела вре-мени, чтобы приехать вечером в сво-бодное время на User Group и узнать что-то новое, пообщаться с интересны-ми людьми. Не сразу, но спустя некото-рое время, и я прочитала свой первый

доклад на мероприятии, а затем и сама стала участником этого замечательно-го сообщества.

Как изменилась программа MSP за этот год и, кстати, произошли какие-то изме-нения в связи с тем, что был также набор нетехнических студентов?

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

?

u

Page 53: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 53

И нтервью

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

Скажите, правда, что MSP – это такое большое дружное сообщество или все-таки сама идея несколько на-думанна?

Всех MSP объединяет важное каче-ство – желание что-то делать. Мы дей-ствительно с удовольствием приходим друг другу на помощь, помогаем найти нужные ответы на вопросы, ездим по возможности в гости и на мероприя-тия. Конечно, некоторые участники до-статочно далеко друг от друга, но это не мешает встречаться регионально, а остальным поддерживать связь вирту-ально. Так или иначе, очень интересно, каких высот добываются другие MSP, это и как пример для подражания, и возможность обменяться опытом. Я очень рада знакомству с каждым участ-ником программы, среди которых у меня много хороших друзей.

Что вам больше всего вам нравится в деятельности MSP?

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

И, конечно же, чувствуется обратная связь с Microsoft, а это, безусловно, приятно.

В целом же, что именно вам дает участие в данной про-грамме?

Конечно же, опыт. Большой опыт в раз-ных направлениях. Это быстрое схва-тывание течений новых технологий, начинаешь замечать основные тенден-ции развития. Это и развитие навыков публичных выступлений, умение доно-сить свою мысль и не боятся публики – это полезно, это интересно. Обмен зна-ниями – с удовольствием учишься у других и рассказываешь о том, что зна-ешь сам. И это много-много мотивации, которая помогает добиваться результа-та шаг за шагом.

К слову, почему и когда вы увидели свое будущее именно в ИТ-технологиях?

Со школьных времен я очень полюби-ла математику, это и определило осо-бое внимание к техническим наукам. Когда мой брат начал активно зани-маться программированием (кстати, он совсем недавно закончил МИФИ), мне этот процесс показался очень уж любопытным. А так как тогда еще все пользовались одним домашним ком-пьютером, некуда было деться от моих приставучих вопросов «а как?» и «по-чему?». Но мне не ответили на эти во-просы, и любопытство привело к само-стоятельному познанию этих науки.

Какие технологии вам ближе всего?

Прежде всего, это конечно технологии Microsoft. Удобно, практично и перспек-тивно.

Я очень люблю .Net, программирование на C#, а также с недавнего времени и

на F#. Начинаею все больше увлекать разработка приложений под Windows Phone 7.

Кроме того, люблю серию продуктов Ex- pression Studio, благодаря которым при- ложение можно сделать еще лучше, еще удобнее и красивее. Благодаря, например, Expression Blend + Sketch-Flow, можно сделать красивые и на-глядные прототипы будущего проекта, отобразить главные детали, без реали-зации всего функционала. Но это толь-ко малая часть его возможностей.

Завлекает также Kinect, очень интерес-но попробовать разработать что-нибудь под него. Но для начала хочется, чтобы сбылась моя небольшая мечта, и в мое распоряжение попал сам Kinect. Конеч-но, есть еще и много других любимых технологий, но я постаралась выделить наиболее близкие. u

?

?

?

?

?

Page 54: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 54

И нтервью

А ваши личные увлечения и хобби, что это?

На самом деле у меня очень много увле-чений, но времени, как правило, не на все хватает. Прежде всего ИТ сфера – это и моя деятельность, и хобби, и ув-лечение. Но есть кое-что еще. Я очень люблю рисовать и когда есть время, учусь какой-нибудь новой технике. Ино-гда пишу стихи, как правило, они как-то сами возникают в голове и строчки сла-гаются сами собой. Стихи позволяют не только интересно поставить рифму, но и лучше понять себя. С недавнего вре-мени занимаюсь хоровым пением. Это некий новый, интересный опыт. Люблю что-нибудь делать своими руками, осо-бенно когда это касается подарков и их упаковки, тут моя фантазия не дрем-лет. Иногда участвую в благотворитель-ных мероприятиях, в которых помогаем нуждающимся семьям.

Кроме того, я очень люблю общение, мотивировать людей на подвиги и да-рить хорошее настроение!)

Сейчас вы учитесь в уни-верситете, скажите, как участие в программе MSP повлияло на процесс вашего обучения, а может быть даже и на ваши оценки?

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

Как к MSP относятся в вузе сами преподаватели?

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

А самим студентам, на-сколько интересны меро-приятия, проводимые в вузе при поддержке Microsoft?

Студенты приходят, интересуются и поддерживают с нами связь. А неко-торые и интересуются как в будущем стать MSP. Раз в семестр мы стара-емся звать действительно интересных людей, которые не относятся к вузу. И очень часто это люди из Microsoft, что еще больше рождает интерес со сторо-ны студентов.

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

В принципе многие компании стараются ориентироваться на работу со студентами, почему именно Microsoft?

Возможно, сказалось то, что именно с Microsoft мой вуз уже сотрудничал. Но с другой стороны, я не видела такой ак-тивности от других компаний. От Micro-

soft это и программа MSP, и большие конференции для студентов, и предо-ставление бесплатного программного обеспечения для обучения и пригла-шение на интересные стажировки, и многое другое. Возможно, Microsoft го-раздо больше внимание уделяет этому сектору.

В этом учебном году вы за-вершаете свое обучение в университете, какие планы на будущее, о чем мечтае-те, и чем будете занимать-ся? u

?

?

?

?

?

?

Page 55: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 55

И нтервью

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

Ваш диплом связан с техно-логиями Microsoft?

Более чем. Когда-то меня очень заин-тересовал язык F#, уже изучила видео-курс Дмитрия Сошникова. А вместе с дипломным руководителем у нас по-явилась идея с какой стороны можно взглянуть на саму структуру языка. Но пока не буду раскрывать всех секретов. Ведь до самой сдачи еще есть время, еще много чего предстоит познать. Но когда все будет готово, я с довольстви-ем поделюсь результатами.

Imagine Cup отдельная и большая тема, планируете участвовать в этом конкур-се? На сколько это интерес-но студентам?

Imagine Cup, как показывает статисти-ка, не так популярен среди Российской молодежи, как за рубежом. Но зато как показывает практика, у наших ребят рождаются весьма креативные идеи, которые оказываются весьма конку-рентоспособными на международном финале. Студенты пробуют, пытаются, развивают идеи – а значит, интерес не угасает.

Кстати совсем скоро, 3 декабря, будет проведен Imagine Cup Boot Camp. Это мероприятие для всех студентов, для тех, кто слышал про Imagine Cup и хо-

чет узнать больше, придумать идею проекта, подобрать команду и позна-комиться с другими активными студен-тами. Что касается меня, то я, конечно, попробую воспользоваться этой воз-можностью. Потому что это еще один способ проявить себя и столкнуться с разными сторонами командной разра-ботки.

Вам повезло побывать и поучаствовать в крупней-шей конференции Tech Ed. Поделитесь своими впечат-лениями, что делали, как все прошло?

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

докладов и осталась очень довольна. А помимо этого успела пообщаться с экс-пертами, участниками, коллегами. Мы опять были весьма заметны в своих фирменных оранжевых футболках. И конечно, я не могла пройти мимо зоны с Kinect. Два действительно не забыва-емых дня.

И последний вопрос, давай-те пофантазируем, как вы себе представляете мир через 20-30 лет?

Я очень люблю ролики Microsoft про бу-дущее, и думаю, что все будет именно так. Вот только недавно вышел ролик Productivity Future Vision и мы все боль-ше приближаемся к этому. Технологии становятся все ближе, все полезней, а вместе с этим мир прекрасней!

А, кроме того, думаю и MSDeveloper.RU к этому времени разовьется до огром-ных высот!)

Очень приятно было с вами пообщать-ся! Надеюсь, я еще не раз появлюсь на страницах этого замечательного жур-нала с интересными статьями. n

?

? ? ?

Page 56: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 56

А SP.NET

Telerik Extensions для ASP.NET MVC Q3 2011

АвторАндрей Тарицын www.taritsyn.ru Веб-разработчикMCPD Web Developer, BMSTU JavaScript Specialist, BMSTU Web Page Authoring Specialist, Google Analytics IQг. Москва

Разработчик: Telerik

Сайт: http://www.telerik.com/products/aspnet-mvc.aspx

Русский перевод: для некоторых элементов управления требуется ручная локализация

Стоимость: Open Source (GPL v2) без возможности получе-ния минорных версий продукта или коммерческая лицензия за 999 USD в год

16 ноября вышла новая версия Telerik Extensions for ASP.NET MVC. Данная версия продукта характеризуется рядом ново-введений: появились новые скины (темы) в стиле Metro, в элемент управления Chart были добавлены три новых типа диаграмм, в элементе управления Editor появилась поддерж-ка навигации с помощью клавиатуры, а также было добав-лено много новых возможностей в элемент управления Grid (меню выбора столбцов, столбец внешнего ключа, пользова-тельские команды и др.).

Рассмотрим более подробно нововведения данной версии.

Поддержка новых браузеров

Как обычно, в Telerik Extensions for ASP.NET MVC реализо-вана поддержка самых последних версий основных браузе-ров. В данном выпуске разработчики официально объявили о поддержке недавно вышедших Mozilla FireFox 8 и Google Chrome 15.

Обновление версии jQuery

С момента выхода версии Q1 2011 долгое время не обнов-лялась библиотека jQuery, включаемая в поставку. В данном релизе, библиотека наконец-то была обновлена до версии 1.6.4.

Новые скины (темы) в Metro-стиле

В последнее время, благодаря популярности телефонов на базе Windows Phone 7 и анонсированию предварительной версии Windows 8, стало модно использовать Metro-стиль в

дизайне веб-сайтов. В качестве примеров можно привести следующие сайты: Patterns & Practices Summit Russia 2011, Русский MSDN и Русский TechNet. Данная тенденция не обо-шла стороной и новую версию Telerik Extensions for ASP.NET MVC, в которую был добавлен скин Metro Blue.

В качестве, примера использования нового скина рекомен-дую посмотреть элемент управления Editor:

К сожалению, при разработке данного скина не были соблю-дены все принципы Metro-дизайна. Например, всплывающее окно, создаваемое с помощью элемента управления Window, имеет декоративную тень, что является недопустимым в Met-ro-дизайне, т. к. Metro ориентирован прежде всего на контент, а не на визуальную составляющую.

Кроме скина Metro Blue, входящего в поставку, есть еще 5 разноцветных Metro-скинов (Red, Magenta, Orange, Lime и Green), которые можно загрузить с сайта Telerik Skin Sharing Portal. u

Page 57: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 57

А SP.NET

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

Сейчас устройства с сенсорным вводом приобретают все большую популярность, и поэтому в новой версии продукта компания Telerik ввела в свои элементы управления (Grid, TreeView, Slider, Splitter и Window) поддержку касаний и перетаскивания.

Элементы управления: Chart (график)

Данная версия продукта привнесла в элемент управления Chart следующие нововведения:

1. Новые типы диаграмм. Появились три новых типа диа-грамм: круговая диаграмма (pie), диаграмма рассеяния (scatter) и линейная диаграмма рассеяния (scatter line).

2. Клиентский метод svg. Метод svg экспортирует текущее представление диаграммы в строку. Возвращаемая методом строка – это самостоятельный SVG-документ, который может быть использован как есть или пре-образован в другие форматы с помощью сторонних инструментов таких как: Inkscape и ImageMagick. Обе программы предоставляют интерфейс командной строки, который подходит для реализации серверной обработки SVG-документов.

Приведу пример кода, реализующего экспорт диаграммы с помощью метода svg:

<script type=«text/javascript»> var chart = $(‘#chart’).data(‘tChart’); var svg = chart.svg();

$.post(«/myapp/export-service», svg, functi- on(data) { $(document.body).append( $(«<img />», { src: data }) ); });</script>

Элементы управления: Grid (сетка)

В данной версии продукта в элемент управления Grid были добавлены следующие возможности:

1. Меню выбора столбцов. Меню выбора столбцов (Column context menu) – это контекстное меню, вызывае-мое щелчком правой кнопки мыши по заголовку столбца. Контекстное меню содержит список чекбоксов, с помо-щью которых можно управлять отображением столбцов (демонстрация).

@(Html.Telerik().Grid<EditableProduct>().Name(«Grid»).ColumnContextMenu() // включает меню выбора столбцов

)

2. Столбец внешнего ключа. Данный тип столбца предна-значен для отображения связанных с внешним ключом данных. Связанные данные должны быть представлены либо как SelectList, либо как IEnumerable.

@(Html.Telerik().Grid<ClientEditableOrder>() .Name(«Grid») .DataKeys(keys => { keys.Add(o => o.OrderID); }) .Columns(columns => { columns.Bound(o => o.OrderID); // Настраиваем столбец внешнего ключа columns.ForeignKey(o => o.EmployeeID, u

Page 58: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 58

А SP.NET

(IEnumerable)ViewData[«employees»], «ID», «Name»); columns.Bound(o => o.OrderDate); columns.Bound(o => o.Freight); columns.Command(commands => commands.Edit()); }) .Pageable())

При переключении в режим редактирования, содержимое ячейки с внешним ключом будет отображаться с помощью элемента управления DropDownList (демонстрация). Данное поведение можно изменить путем модификации шаблона ре-дактирования (editor template) GridForeignKey.

3. Пользовательские команды. В Grid была добавлена возможность выполнять пользовательские команды с по-мощью командных столбцов. Пользовательские команды могут быть сконфигурированы для вызова действий контроллера, как с помощью серверных запросов, так и Ajax-запросов (демонстрация). Пользовательскую коман-ду можно задать с помощью следующего кода:

@(Html.Telerik().Grid(Model) .Name(«Grid») .Columns(columns => { ... // Задаем пользовательскую команду columns.Command(commands => commands // Имя пользовательской команды // (используется для того, чтобы различать // несколько пользовательских команд) .Custom(«viewDetails») // Задаем текст кнопки .Text(«Customer Details») // Указываем какие поля из источника // данных нужно включить в маршрут, чтобы // передать их значения в качестве // параметров действию контроллера .DataRouteValues(route => route .Add(o => o.OrderID) .RouteKey(«orderID») ) // Указываем, что будем использовать Ajax-запросы .Ajax(true) // Указываем действие контроллера .Action(«ViewDetails», «Grid»)) }) ...)

4. Изменения в клиентском API. У Grid`а появилось новое событие OnComplete, которое возникает при завершении Ajax-запроса. Также в клиентский API были добавлены методы для отображения/сокрытия (show/hide) столбцов.

5. Удалены CSS-классы t-last и t-header-last. CSS-классы t-last и t-header-last больше не используются при генерации HTML-разметки Grid`а.

Элементы управления: Editor (редактор)

В элемент управления Editor добавлена интуитивная под-держка клавиатуры (клавиши быстрого доступа), что делает его более доступным для людей с ограниченными возмож-ностями (демонстрация).

Элементы управления: TreeView (дерево элементов)

В клиентский API TreeView были добавлены методы findItem-ByText и findItemByValue, обеспечивающие поиск элементов по их тексту и значению.

Элементы управления: Upload (загрузка файлов)

В конфигурационный метод Save элемента управления Up-load, с помощью которого настраиваются параметры вызова действия контроллера, отвечающего за сохранение файлов, добавлен дополнительный параметр fieldName. С помощью параметра fieldName можно задать имя поля формы, которое будет использоваться для отправки файлов. Если не указать данный параметр, то будет использоваться имя элемента управления Upload.

Исправление ошибок и недоработок

В элементах управления NumericTextBox, DatePicker и Sli-der больше не пробрасывается исключение, когда значение выходит за пределы заданного диапазона. Кроме того, был исправлен ряд небольших ошибок в следующих элементах управления: Grid, Editor, TreeView, Window, NumericText-Box, Date/Time Pickers, ComboBox, Upload, Slider, Menu, Tab- Strip и Chart.

С полным списком изменений можно ознакомиться на сайте Telerik.

Заключение

На данный момент Telerik Extensions for ASP.NET MVC уже стал зрелым продуктом и с каждым релизом приближается по функционалу к своему старшему брату RadControls for ASP.NET AJAX.

Начиная с версии Q1 2011 разработчики сделали ставку на использование современных веб-стандартов (HTML5, CSS3 и SVG). Результаты данного решения сейчас хорошо видны: элемент управления Chart позволяет создавать впечатляю-щие графики с помощью SVG, Upload использует всю мощь HTML5 File API и большая часть элементов управления сти-лизована с помощью CSS3.

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

Page 59: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 59

S ilverlight

АвторВалерий Воробьев Разработчикг. Москва

Обзор Devexpress

При разработке пользовательского интерфейса про-граммисты, как правило, используют готовые компо-ненты. Мало кому захочется самостоятельно с нуля

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

В этой статье я расскажу о сторонних компонентах для Sil-verlight от компании Devexpress. Статья рассчитана на чита-теля, не знакомого с компонентами Devepxress. Если у вас уже есть опыт работы с Devexpress, то, скорее всего эта ста-тья будет вам не интересна.

Компания Devexpress выпускает не только компоненты для Silverlight. В число ее продуктов входят компоненты для WPF, ASP.NET Webforms, ASP.NET MVC Extentions, Winforms и т. д.

Свое знакомство с Devexpress я начал с элементов управле-ния для .NET Winforms в 2005 году. Меня поразило огромное количество различных элементов управления. В то время они позволяли создавать мощные Windows-приложения с впечатляющим интерфейсом, а самое главное то, что поль-зователи были в восторге от таких приложений!

Со временем появились технологии WPF и Silverlight. В свя-зи с этим компания Devexpress незамедлительно выпустила компоненты под эти новые технологии. Сначала для WPF, а затем и для Silverlight.

На данный момент библиотека Devexpress for Silverlight на-считывает более 55 компонентов. Все компоненты Devexpress for Silverlight можно разделить на следующие группы:

{ Reporting (отчеты),

{ Toolbar-Menu (меню),

{ Tree List View (табличное представление),

{ Layout Manager (менеджер компоновки),

{ Utility Controls (базовые компоненты),

{ Data Grid (таблица данных),

{ Chart Controls (графики и диаграммы),

{ Gauge Controls (датчики),

{ Data Editors (элементы редактирования данных),

{ Spell Checkers (проверка орфографии),

{ Ribbon Controls (ленточные элементы управления),

{ Rich Text Editor (текстовый редактор),

{ Dock Windows (стыковка окон),

{ Navigation Pane (панели навигации)

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

Reporting (Отчеты)

Пожалуй, одними из наиболее важных элементов управления для разработки бизнес-приложения являются отчеты. Для проектирования отчетов Devxpress Reporting предоставля-ет специализированный дизайнер, который интегрируется в Visual Studio.

После установки Devexpress Reporting, в Visual Studio станет доступен новый шаблон – XtraReport. Создав новый элемент XtraReport, в Visual Studio, откроется область редактирова-ния отчета. Это холст, на котором можно размещать различ-ные элементы и связывать их с данными. На панели инстру-ментов размещается группа элементов Report Controls.

Screen1

Элементы управления для создания отчетов способны по-крыть большинство задач. С их помощью можно легко пред-ставить данные в матричном виде или сделать «drill down report» (детализация отчета). Так же есть огромное количе-ство всевозможных графиков и диаграмм. u

Page 60: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 60

S ilverlight

Хочу отметить, что работать с дизайнером отчетов Devexpress одно удовольствие. Он очень мощный, быстрый, удобный и имеет привлекательный внешний вид.

Спроектированный отчет можно отобразить в Silverlight при-ложении с помощью элемента управления Devexpress Do-cumentPreview. Он так же позволяет вывести отчет на пе-чать, сохранить в различных форматах, таких как: xlsx, pdf, htm, rtf и т. д.

Чтобы загрузить отчет в элемент управления DocumentPre-view, достаточно всего лишь задать адрес службы, возвра-щающей отчет и название отчета. Вот как выглядит загружен-ный отчет в Devexpress DocumentPreview.

Toolbar-Menu (Меню)

Toolbar-Menu позволяет реализовать верхнее меню, панель инструментов и строку состояния. Фактически с помощью только одного элемента управления можно сформировать полноценную рабочую область, аналогичную популярным офисным приложениям.

Элемент управления BarManager поддерживает все возмож-ности Silverlight 4, в том числе команды, поэтому при разра-ботке не возникнет проблем с реализацией паттерна MVVM. Он так же позволяет избежать повторного написания кода.

Стоит отметить, что элемент управления BarManager был полностью спроектирован с нуля, учитывая все особенности разработки Silverlight приложений. Благодаря этому он рабо-тает быстрее и позволяет решать множество задач деклара-тивно, то есть без написания кода.

Tree List (древовидный список)

Элемент управления Tree List позволяет представить дан-ные в таблице, используя иерархическое представление. Это помогает особым образом сгруппировать данные так, чтобы при их анализе можно было пройтись по всей иерархии свя-занных данных.

Devexpress Silverlight Tree List поддерживает следующие основные операции:

{ возможность вручную создавать и заполнять дерево,

{ отображение нескольких столбцов иерархических дан-ных,

{ сортировку данных,

{ фильтрацию данных,

{ отображение агрегированных данных, для быстрого ана-лиза (COUNT, MAX, MIN, SUM, AVERAGE),

{ редактирование данных с использованием элементов управления Devexpress Silverlight Editors,

{ редактор выражений.

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

Layout Manager (менеджер компоновки)

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

{ Layout Control – основной элемент для управления ком-поновкой страницы. Он позволяет настраивать компонов-ку элементов управления, во время выполнения приложе-ния.

{ Flow Layout Control – данный элемент позволяет органи-зовать последовательную компоновку на странице. Он ав-томатически выравнивает содержимое в зависимости от размеров контейнера. Этот контейнер отлично подойдет для создания фотогалерей. u

Page 61: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 61

S ilverlight

{ Dock Layout Control – позволяет расположить элементы управления, стыкуя их по краям. Конечный пользователь может изменять размеры каждой области.

{ Group Box Control – позволяет объединять логически связанные элементы управления в группу. Этот контейнер имеет заголовок и рамку.

{ Scroll Box Control – этот элемент управления позволяет прокручивать содержимое, не умещающееся на экране.

Utility Controls (базовые компоненты)

Utility Controls – это набор компонентов, предоставляющих базовую функциональность для разработки современных Silverlight приложений.

{ Window and Dialog Controls – всплывающие и модаль-ные диалоговые окна.

{ Tab Control – более продвинутая версия стандартного элемента управления вкладками.

{ Book Control – элемент управления «Книга». Представ-ляет собой имитацию настоящей книги с перелистывани-ем страниц. Не смотря на то, что этот элемент довольно редко используется на практике, выглядит он очень эф-фектно.

{ Mirror Control – позволяет имитировать эффект отраже-ния. u

Page 62: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 62

S ilverlight

{ Transition Container – позволяет управлять перехода-ми, переключениями между элементами управления. Его можно гибко настроить на использование различных ани-мационных эффектов.

{ Upload Control – позволяет пользователю загружать фай-лы на сервер, а так же управлять процессом загрузки, на-пример, приостанавливать или отменять загрузку файлов.

{ WorkspaceManager – позволяет управлять макетами раз-личных Devexpress элементов управления, например, сохранять различные настройки элемента DXGrid и т. д. Кроме того он поддерживает несколько анимационных эффектов для перехода между различными шаблонами.

Data Grid (таблица данных)

DataGrid Control – это таблица данных, позволяющая ото-бражать, редактировать данные, выводить их на печать и т. д. Данный элемент управления предоставляет огромное коли-чество возможностей. Ниже описаны ключевые возможности Devexpress DataGrid, выделяющие его на фоне сеток данных.

{ Индикатор занятости, информирующий о процессе за-грузки данных. Так как данные в таблицу подгружаются

асинхронно, интерфейс всегда сможет реагировать на действия пользователя.

{ Гибкая настройка содержимого таблицы.

{ Представление данных в древовидном виде.

{ Сортировка и группировка данных.

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

{ Агрегирование и суммация данных. Позволяет «на ходу» анализировать данные. Рассчитывает итоговые суммы, максимум, минимум, среднее значение и т.д.

{ Редактирование данных с использованием специализиро-ванных элементов управления Devexpress.

{ Вывод таблицы на печать. Пожалуй, это одна из самых за-мечательных возможностей DXGrid. Можно легко вывести u

Page 63: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 63

S ilverlight

данные на печать или сохранить их в одном из популяр-ных форматов, например excel, pdf, html и т. д.

{ Селекторы строк и ячеек. С их помощью можно очень про-сто настроить поведение таблицы для выделения опреде-ленным цветом строк и ячеек.

{ Редактор выражений.

Chart Controls (графики и диаграммы)

Chart Controls – это набор более чем из 15 видов графиков и диаграмм. Ниже перечислены все основные типы графиков и диаграмм, которые включены в Devexpress Silverlight Chart Controls.

Элемент управления для создания диаграмм.

Screen29

Графики и диаграммы 2D.

Screen30

Среди Devexpress Silverlight Chart Controls вы найдете практически все типы графиков и диаграмм, которые могут вам потребоваться. К сожалению, на данный момент отсут-ствуют трехмерные графики и диаграммы. Вероятно, они по-явятся в будущем после выхода Silverlight 5, который будет поддерживать 3D.

Стоит отметить, что некоторые типы диаграмм, например ги-стограмма, поддерживают псевдо 3D.

Компоненты Devexpress Silverlight Chart Controls имеют ряд особенностей, которые позволяют более наглядно анализи-ровать данные. Ниже приведен список таких особенностей.

{ Можно использовать различные типы диаграмм в одной диаграмме.

{ Есть возможность менять местами оси X и Y, изменив все-го одно свойство.

{ Решение проблемы с перекрытием меток. Такая пробле-ма может возникнуть, если у вас на диаграмме имеется множество пунктов. В таком случае метки, характеризую-щие каждый пункт, могут перекрывать друг друга. В итоге получается «каша», и диаграмма становится нечитаемой. Для решения этой проблемы в Devexpress Silverlight Chart Controls был включен специальный алгоритм, раз-решающий эту проблему. Данный алгоритм портирован из winforms и адаптирован для использования в Silverlight.

{ Можно создавать множество осей в рамках одной диа-граммы, что позволит более наглядно сравнивать серии.

{ Можно создавать пользовательские линии, например по-лосы, указывающие на минимум и максимум. u

Page 64: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 64

S ilverlight

{ Эффект отражения.

Компоненты Devexpress Silverlight Chart Controls поддер-живают огромное количество тем и анимаций, поэтому вы всегда сможете настроить внешний вид диаграмм, чтобы они выглядели максимально естественно в вашем приложении.

Gauge Controls (датчики)

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

Devexpress Silverlight Gauge Controls предоставляют сле-дующие возможности для создания датчиков.

{ Круговой датчик,

{ Линейный датчик,

{ Интерактивное взаимодействия пользователя с датчика-ми.

Devexpress Silverlight Gauge Controls предоставляют боль-шое количество тем оформления датчиков, поэтому их внеш-ний вид не трудно настроить под конкретное приложение.

Data Editors (элементы редактирования данных)

Data Editors – это набор компонент для редактирования дан-ных. Они служат основным инструментом для создания экран-ных форм. Элементы управления входящие в DXEditors.

Screen41

Возможности каждого элемента управления, входящего в кол-лекцию DXEditors довольно обширны, поэтому приведу лишь наиболее интересные характеристики компонент DXEditors.

{ DXEditors Controls могут быть встроены в такие эле-менты управления как DXGrid, DXTreeList, DXBars.

{ Поддержка валидации данных, маски ввода и регулярных выражений.

{ Поддержка форматирования данных.

Spell Checkers (проверка орфографии)

Spell Checker – элемент управления для проверки орфогра-фии, позволяющий проверять орфографию в стандартном элементе управления TextBox и в компонентах Devexpress TextEdit и RichTextEditControl.

Ribbon Controls (ленточные элементы управления)

Ribbon Controls – это ленточный элемент управления, по-зволяющий имитировать меню Microsoft Office 2007 и 2010. Devexpress Silverlight Ribbon Controls обладает следующи-ми возможностями. u

Page 65: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 65

S ilverlight

{ Настраиваемый внешний вид ленты как под стиль Mi-crosoft Office 2007, так и под Office 2010. Главное отличие заключается в форм-факторе главной кнопки, располо-женной в левом верхнем углу. Так в стиле Office 2007 она круглая, а в 2010 прямоугольная.

{ Поддержка регулярных и контекстных страниц.

{ Раскрывающиеся галереи, позволяющие элегантно визу-ализировать списки.

{ Поддержка большого количества элементов управления.

{ Автоматическая адаптация ленты к изменениям размеров окна.

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

{ Минимизация ленты.

Rich Text Editor (текстовый редактор)

Rich Text Editor – продвинутый текстовый редактор, поддер-живающий оформление в стиле Microsoft Office. Devexpress Silverlight Rich Text Editor позволяет: выполнять сложные форматирования текста, выводить документ на печать, осу-ществлять предпросмотр, сохранять документ в различных форматах. Среди поддерживаемых форматов можно выде-лить следующие: doc, docx,xml, odt, rtf и т. д.

К сожалению, Rich Text Editor не поддерживает сноски, по-этому если вы захотите открыть документ Microsoft Office со сносками, то, скорее всего, вы их не увидите. В остальном документы Office 2003, 2007, 2010 открываются хорошо, с сохранением сложного форматирования, включая таблицы, символы и фигуры.

Dock Windows (стыковка окон)

Dock Windows – это компонент, управляющий стыковкой окон. Он предоставляет конечному пользователю возмож-ность самостоятельно настраивать расположение окон. Фак-тически Devexpress Silverlight Dock Windows эмулирует IDE интерфейс, например, как в Visual Studio 2010.

Ниже описаны основные возможности элемента управления Devexpress Silverlight Dock Windows.

{ Поддержка drag and drop.

{ Подсказки, появляющиеся при стыковке окон, имеют стиль Visual Studio. u

Page 66: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 66

S ilverlight

{ Панели можно закреплять и откреплять, используя кноп-ку «Пин», включая или отключая автоматическое скрытие панели.

{ Панели можно менять местами, используя drag and drop.

{ Размеры панелей можно изменять во время выполнения.

{ Встроенное контекстное меню.

{ Макет можно сохранять.

Navigation Pane (панели навигации)

DXNavBar – это навигационная панель, включающая в себя три шаблона представления: Side Bar Layout, Explorer Bar Layout, Office 2007 Style Navigation Pane. Хотя этот элемент управления идеально подходит для создания навигационно-го меню, его можно использовать и в других сценариях, на-пример для создания слайд-шоу.

Элемент управления Devexpress Silverlight Navigation Bar имеет три представления, которые позволяют различным об-разом организовать данные. Каждое представление идеаль-но подходит для решения конкретной задачи. Вот их особен-ности:

{ Side Bar Layout (шаблон боковой панели) – данный ша-блон представляет собой набор групп. Одновременно может быть показано содержимое только одной группы. Когда пользователь щелкает мышью по другой группе, те-кущая группа скрывается, и та группа, по которой щелкну-ли, становится активной.

{ Explorer Bar Layout (шаблон панели обозревателя) – этот шаблон позволяет показывать и скрывать содержимое

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

{ Office 2007 Style Navigation Pane (шаблон навигацион-ной панели Office 2007) – как видно из названия, данный шаблон помогает имитировать работу панели Microsoft Outlook. Группы располагаются снизу, а сверху отобра-жается содержимое текущей группы. Группы можно скры-вать, а так же можно скрывать панель целиком, освобож-дая место для других областей окна.

***

Использование хороших коммерческих компонентов при раз-работке приложений позволяет существенно упростить жизнь программиста, а приложения сделать более качественными и привлекательными. Я без преувеличения могу сказать, что на реализацию всех возможностей, предоставляемых компо-нентами Devexpress for Silverlight уйдут годы. А поддержка своих библиотек будет очень затратной.

Если вы еще никогда не сталкивались с компонентами Dev-express и сейчас стоите перед выбором коммерческой биб-лиотеки, то можете скачать бесплатно ознакомительную вер-сию элементов управления Devexpress for Silverlight, чтобы самостоятельно оценить ее возможности.

У компонентов Devexpress for Silverlight есть и свои особен-ности. Во-первых, они довольно своеобразны, к ним нужно привыкать. Так, например, если вы использовали раньше Sil-verlight Tool Kit, то возможно вы будете несколько растеряны при работе со свойствами новых элементов управления, по-скольку в некоторых случаях они имеют не привычные имена.

Во-вторых, на момент написания статьи присутствуют неко-торые ошибки и недоработки в работе некоторых элементов управления с паттерном MVVM. Будем надеяться, что в сле-дующей версии их исправят.

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

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

Page 67: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 67

W indows Phone 7

АвторМихаил Галушко Wp7rocks.comMCPD .NET 4.0, MCPD .NET 3.5«Экстракод»г. Киев

Хранение данных в Windows Phone

Все программы без исключения каким-то образом рабо-тают с данными и, соответственно, появляется вопрос: где и как их хранить? Для мобильных приложений есть

свои нюансы, которые обусловлены спецификой платформы. В этой статьи мы рассмотрим возможные подходы хранения данных для мобильной операционной системы от Microsoft – Windows Phone.

Что было в Windows Phone 7?

Начнем с того, что нам было доступно в первой версии ОС:

1. Настройки приложения (Isolated Settings Storage),

2. Изолированное хранилище файлов (Isolated File Storage),

3. Внешний веб-сервис.

Сначала разберемся с основным понятием – изолированное хранилище.

Изолированное хранилище (IsolatedStorage) – от-дельно выделенная область для хранения данных, доступ к которой имеет только текущее прило-жение. Доступ из любого другого приложения не-возможен.

Хранилище делится на две части: хранилище настроек и хра-нилище файлов.

Настройки приложения

Коллекция в виде «ключ-значение» хранится в изолирован-ном хранилище. Работать с настройками необходимо через класс IsolatedStorageSettings.Пример использования:

Чтение:

IsolatedStorageSettings settings = IsolatedStorage-Settings.ApplicationSettings;

var value = settings[“key”];

Запись:

IsolatedStorageSettings settings = IsolatedStorage-Settings.ApplicationSettings;

settings.Add(“key”,”value”);

Обновление:

IsolatedStorageSettings settings = IsolatedStorage-Settings.ApplicationSettings;

settings[“key”] = “value”;

Сохранять можно объекты любого типа, которые могут быть сериализованы (для сериализации используется DataCon-tractSerializer).

Изолированное хранилище файлов

Представляет собой традиционную файловую систему – можно создавать любые структуры из папок и файлов.

Работа с хранилищем ничем не отличается от работы с тра-диционной файловой системой. Доступ к файлам и папкам получаем через класс IsolatedStorageFile и его метод Get- UserStoreForApplication (возвращает экземпляр типа Iso-latedStorageFile).

Методы IsolatedStorageFile:

{ GetDirectoryNames – получить список всех директорий;

{ GetFileNames – получить список всех файлов;

{ CreateDirectory – создать директорию;

{ DeleteDirectory – удалить директорию;

{ DirectoryExists – проверить существование директо-рии;

{ CreateFile - создать файл;

{ OpenFile – открыть файл для чтения/редактирования;

{ DeleteFile – удалить файл;

{ FileExists – проверить существование файла.

Пример работы: u

Page 68: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 68

W indows Phone 7

Чтение файла:

using (var file = IsolatedStorageFile.GetUserStore-ForApplication().OpenFile(“file.txt”, FileMode.Open)) { using (var fileReader = new StreamReader(file)) { string content = fileReader.ReadToEnd(); }

}

Запись в файл:

using (var file = IsolatedStorageFile.GetUserStore-ForApplication().CreateFile(“file.txt”)) { using (var fileWriter = new StreamWriter(file)) { fileWriter.WriteLine(“test string”); } }

Внешний веб-сервис

В этом случае приложение может взаимодействовать с уда-ленным веб-сервисом через определенный API. Это может быть как работа с RSS потоками (XML), так и с любыми дан-ными в заданном формате (JSON и т. д.).

Для мобильных разработок часто используют именно JSON, так как он более «легковесный» в сравнении с XML. Хотя не так давно Google разработала замену JSON’у – ProtoBuf, но об этом сегодня мы говорить не будем.

Пример запроса к сервису:

public void Load() { var request = (HttpWebRequest)WebRequest.Cre- ate(“remote url”); var result = (IAsyncResult)request.BeginGet- Response(ResponseCallback, request); }

void ResponseCallback(IAsyncResult result) { var request = (HttpWebRequest)result.AsyncState;

var response = request.EndGetResponse(result);

using (var stream = response.GetResponseStream()) { //читаем поток и выполняем необходимые операции } }

Это самый простой вариант обращения по удаленному адре-су. Всегда можно использовать решения типа WCF сервиса (через контракт и прокси классы), библиотеки для работы с RSS потоками, JSON и прочие.

Доступно множество движков БД, основанных на изолиро-ванном хранилище: Sterling, WindowsPhoneDb и другие. Рас-смотрим подробнее библиотеку Sterling.

Что такое Sterling?

NoSQL OODB построена на основе изолированного хранили-ща.

Разработчик: Jeremy Likness

Сайт проекта: http://sterling.codeplex.com/

Особенности Sterling:

{ не требует изменений в объектной модели;

{ есть поддержка LINQ ;

{ доступно построение индексов для выборок;

{ библиотека доступна для: WP7, Silverlight 4,5 и .NET 4.0;

{ поддержка Tombstone;

{ легкая и бесплатная.

Принципы работы с библиотекой:

1. Описать модель БД в отдельном классе.

2. Инициализировать БД при старте приложения.

3. При деактивации приложения – деактивировать БД.

Описание БД в отдельном классе:

public class MyDbInstance : BaseDatabaseInstance {

protected override List<ITableDefinition> Regis- terTables() {

return new List<ITableDefinition> {

//список типов сущностей, которые мы плани- руем хранить, указание первичного ключа CreateTableDefinition<Company, int>(c => c.Id).WithIndex<Company, int, int>(“Com- panyId”,c => c.Id) .WithIndex<Company, string,int>(“CompanyName”,c=>c.Name)

}; }

public override string Name { get { return “MyDb”; } } }

При этом еще мы описали индекс для поля CompanyId и поля CompanyName для ускорения выборки данных по ним.

Инициализация и регистрация БД:

var engine = new SterlingEngine(); engine.Activate(); ISterlingDatabaseInstance database = engine.Ster- lingDatabase.RegisterDatabase<MyDbInstance>(new IsolatedStorageDriver());

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

Деактивация:

engine.Dispose();

Что умеет Sterling

1. Выборка данных.

По ключу:

Company company = database.Load<Company>(4);

По предикату:

var companies = database.Query<Company, int>(). Where(c => c.LazyValue.Value.Name.Contains(“se-arch”)).ToList();

По предикату по индексу:

var companies = database.Query<Company, string, int>(“CompanyName”).Where(u

Page 69: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 69

W indows Phone 7

c => c.Index.ToUpper().Contains(“search”)). ToList();

2. Сохранение объектов (вставка и обновление). В обоих случаях нужно явно вызывать метод Save() или ему по-добный.

Сохранение:

var company = new Company();database.Save(company);

Асинхронное сохранение:

database.SaveAsync(list);//сохранение списка сущ-ностей

3. Удаление объектов.

Имея сущность:

database.Delete(company);

По ключу и типу сущности:

database.Delete(typeof(Company),4);

4. Бэкап БД.

var memStream = new MemoryStream(); byte[] databaseBuffer; using (var binaryWriter = new BinaryWri- ter(memStream)) { engine.SterlingDatabase.Backup<MyDb- Instance>(binaryWriter); binaryWriter.Flush(); databaseBuffer = memStream.GetBuffer(); }

5. Восстановление из бэкапа.

var database = engine.SterlingDatabase.Register-Database<MyDbInstance>(new IsolatedStorageDriver());

engine.SterlingDatabase.Restore<MyDbInstance>(new BinaryReader(new MemoryStream(databaseBuffer)));

engine.Dispose();

engine = new SterlingEngine();

engine.Activate();

var databaseInstance = engine.SterlingDatabase.Re-gisterDatabase<MyDbInstance>();

6. Обновление схемы БД. Этот вопрос всегда актуален для разработчиков, так как вносить изменения в суще-ствующий проект приходится всегда. Как обстоит дело с этим в Sterling? Встроенной поддержки обновления нет. Эта проблема решается следующим образом:

1. Создается новый класс с новыми свойства (с тем же именем, но другим пространством имен).

2. Новая сущность описывается в новой БД.

3. Регистрируются старая и новая БД.

4. Определяется наличие старой БД и выполняется экс-порт данных из старой БД в новую.

Процедура получается не самая простая, поэтому требует тщательного тестирования.

Что есть еще и осталось вне этой статьи по Sterling:

{ работа с синглтонами;

{ псевдо-транзакции;

{ триггеры;

{ интерсепторы.

Что появилось Windows Phone 7.5 Mango?

Обновление Mango принесло нам возможность хранить дан-ные в традиционной реляционной базе данных, используя для доступа технологию LINQ to SQL.

SQL Compact Edition

Это портированный MS SQL Server Compact Edition 3.5 на платформу Windows Phone.

Возможности SQL CE:

{ LINQ to SQL;

{ механизм обновление схемы;

{ поддержка индексов;

{ доступно два подхода: Code-First (сначала модель, потом БД), Database-First (сначала схема БД, потом генерация модели с помощью утилиты SqlMetal – входит в состав Windows Phone 7.1 SDK);

{ быстрый «readonly» режим;

{ максимальный размер файла БД – 512 Мб.

Принципы работы с SQL CE

1. Описание классов и маппинг.

[Index(Columns = “Name”, Name = “Company_Index_Name”)] [Table]public class Company{ private int _id;

[Column(IsPrimaryKey = true, IsDbGenerated = fal- se, DbType = “INT”, CanBeNull = false, AutoSync = AutoSync.OnInsert)] public int Id { get { return _id; } set { if (_id != value) { NotifyPropertyChanging(()=>Id); _id = value; NotifyPropertyChanged(()=>Id); } } }

private string _name;

[Column(DbType = “NVARCHAR(300)”)] public string Name {u

Application

DataContext(System.Data.Linq)

IsolatedStorage

Local Database

LINQ to SQLRuntime

Page 70: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 70

W indows Phone 7

Ссылки

get { return _name; } set { if (_name != value) { NotifyPropertyChanging(()=>Name); _name = value; NotifyPropertyChanged(()=>Name); } } }}

Мы описали класс Company и создали индекс для поля Name.

2. Описание класса DataContext, через который будет осу-ществляться доступ к БД.

public class MyDataContext : DataContext{ public MyDataContext(string connectionString) : ba-se(connectionString) { }public Table<Company> Companies;}

3. Инициализация (используется подход Code-First).

using (var db =new DbDataContext(“isostore:/Data-base1.sdf”)){ if (!db.DatabaseExists()) { db.CreateDatabase(); }//здесь можно обращаться к данным}

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

Что умеет SQL CE

1. Выборка данных.

По ключу:

var company = db.Companies.Where(c => c.Id == 5). FirstOrDefault();

По предикату:

var companies = db.Companies.Where(c => c.Name.Con-tains(“query”)).ToList();

2. Вставка записи.

var company = new Company();db.Companies.InsertOnSubmit(company);db.SubmitChanges();

3. Обновление записи.

var company = db.Companies.Where(c => c.Id == 5).FirstOrDefault(); company.Name = «test”; db.SubmitChanges();

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

4. Удаление записи.

var company = db.Companies.Where(c => c.Id == 5).FirstOrDefault(); db.Companies.DeleteOnSubmit(company); db.SubmitChanges();

5. Обновление схемы БД.

DatabaseSchemaUpdater updater = db.CreateDataba-seSchemaUpdater(); if (updater.DatabaseSchemaVersion == 0) { updater.AddColumn<Company>(“Description”); updater.DatabaseSchemaVersion = 1; updater.Execute(); }

Определяем текущую версию, вносим необходимые изме-нения и сохраняем их.

6. Работа с БД в режиме «readonly».

using(var inDb = new MyDataContext(“Data Source = ‘appdata:/Companies.sdf’; File Mode = read only;”)) { var companies = inDb.Companies.ToList(); }

Что осталось «за бортом»:

{ Бэкап БД,

{ Восстановление из бэкапа.

Дополнительную информацию по SQL CE можно найти в ста-тье Филипа Панфилова «Работа с базой данных в WP7 для ленивых» журнал MSDeveloperRU №3 за ноябрь 2011г.

Сравнение Sterling и SQL CE

Макс Павловский (разработчик из Минска) сделал неболь-шое сравнение движков. Из его результатов и своего опыта использования этих библиотек могу сказать следующее:

Ваш выбор – Sterling, если:

{ небольшие объемы данных;

{ в основном – чтение данных;

{ одинаковые частые запросы (покрываются индекса- ми) – выборка не по индексу выполняется долго, т. к. требует загрузки объектов;

{ простые данные (целостность не обязательна);

{ владеете «многопоточностью».

Ваш выбор – SQL CE, если:

{ большие объемы данных;

{ сложная структура классов;

{ планируется обновление схемы БД;

{ частые обновления\вставки;

{ многопоточность ваше не самое сильно место;

{ есть опыт работы с LINQ to SQL либо Entity Framework.

В данной статье мы рассмотрели возможные механизмы для хранения данных в приложениях под платформу Windows Phone и определили, какие движки необходимо использовать в определенных случаях. Сторонние решения, вроде порти-рованного SQLite, не рассматривались. n

1. Серия статей по SQL CE 2. Статья про Sterling от создателя 3. Документация по Sterling4. MSDN5. Принципы работы со Sterling6. Сравнение SQL CE и Sterling

Page 71: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 71

W indows Phone 7

Аппаратная начинка Windows Phone 7

АвторМария Черныхwww.w7phone.ruКомпания «ModernSolution»г. Киров

Начинка всех смартфонов на базе Windows Phone 7 практически не отличается друг от друга. В на-

стоящее время сертифицированным производителем чипсе-тов является только одна компания – Qualcomm.

Энди Лиз (Andy Lees), гла-ва подразделения Win- dows Phone, 20 октября этого года дал небольшое интервью. В нем предста- витель Microsoft сообщил, что работа с единственным постав-щиком чипсетов имеет свои преиму-щества. Благодаря этому появляется возможность тесного взаимодействия с производителем, и технические харак-теристики устройств прорабатываются более детально. Как следствие, гаран-тируется плавность и скорость работы операционной системы. Кроме того, Microsoft надеется на значительное снижение стоимости чипсетов в резуль-тате массового производства.

Qualcomm

«В настоящее время у нас нет планов по сотрудничеству с другими произ-водителями полупроводников», – со-общил Лиз. Это заявление, однако, не означает, что работа по расширению компонентной базы не ведется. В сети неоднократно появлялась информа-ция о заинтересованности со стороны Nvidia и ST-Ericsson. Вполне возможно, в будущем мы увидим WP-смартфоны на базе чипсетов этих компаний.

Линейка мобильных чипсетов компании Qualcomm носит название Snapdragon.

Каждый чипсет включает в себя процес-сор ARM-архитектуры и ряд дополни-тельных модулей. На устройствах пер-вой волны Windows Phone установлены

микросхемы MSM8250, в состав которых входит гра-фическое ядро Adreno 200.Смартфоны второго поко- ления оборудованы чипсе-тами MSM8255. Их отличи- тельными особенностями являются графический про-цессор Adreno 205 и повы-шенная тактовая частота

вычислительного ядра.

Линейка Qualcomm Snapdragon для Windows Phone включает в себя исклю-чительно одноядерные микросхемы частотой от 1 до 1,5 ГГц. Многие за-даются вопросом, почему девайсы под управлением современной операцион-ной системы не оборудованы многоя-дерными чипами. Двуядерные процес-соры уже стали вполне привычными на Android-смартфонах. В этой связи авто-ры интернет-издания Fudzilla взяли ин-тервью у представителей Qualcomm. В компании считают, что использование многоядерных процессоров не оправ-данно для Windows Phone:

«Все смартфоны [на ба- зе Windows Phone] по- строены в соответствии с определенными аппа- ратным требованиями, которые обеспечивают беспроблемную и высо- кокачественную рабо-ту устройств. Мобиль- ный процессор Qual- comm Snapdragon и про-граммное обеспечение чипсета, кото-рым сегодня оснащается каждый WP- смартфон, способны обеспечить поль-

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

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

Энрико Сальватори (Enrico Salvatori), президент подразделения CDMA тех- нологий Qualcomm в Евпропе, в нача- ле ноября провел беседу с редакцией TechRadar. Сальватори сообщил, что его компания совместно с Nokia рабо-тает над планом по созданию смарт-фонов. Недавно выпущенные модели Lumia являются только началом этого сотрудничества.

«Мы работаем над дорожной кар-той [совместно с Nokia] и это не одно устройство, не одна линейка. Для Qual-comm сотрудничество с Nokia важно, мы очень рады работать вместе. Со-вместная разработка телефонов эф-фективна с точки зрения выхода на рынок».

Результатом сотрудничества двух ком-паний может стать реализация техно- логии NFC (Near Field Communication) на смартфонах под управлением Win-dows Phone. NFC требует небольшого

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

В недавнем интервью на конференции All Things Digital Asia Энди Лиз сооб-щил, что Microsoft может в следующем

В настоящее время сертифициро-ванным произво-дителем чипсетов является только одна компания – Qualcomm.

Все текущие по-требности в ресур-сах операционной системы и прило-жений могут быть удовлетворены существующими чипами.

u

Page 72: 12 (04) MSDeveloperRU

12 (04) 2011 MSDeveloper.RU 72

W indows Phone 7

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

«Одна из целей Micro-soft – избавиться от фрагментации. Мы хоте- ли избежать проблем с фрагментацией, поэтому ввели ряд ограничений. Наши партнеры могли бы добавить что-то от себя, но не все, что им заблагорас-судится. В следующем году уровень контроля может снизиться, и у произ-водителей появятся возможности рас-ширить функционал новых устройств... Если кому-то из наших партнеров хочется добавить NFC, он может это сделать. При этом остальные не обя-заны так поступать. Другое дело – ми-

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

с операционной системой».

Qualcomm надеется продолжить со-трудничество с Microsoft. Кристиано Амон (Cristiano Amon), вице-президент Qualcomm CMDA Technolgies, сообщил, что компания будет работать с Microsoft над платформой Windows Phone 8. «Наши процессоры станут первыми для их новых телефонов», – уверенно заявил Амон.

На сентябрьской конференции Innova-tion Qualcomm в Стамбуле стало из-вестно, что в 2012 году появятся 2,5 ГГц четырехядерные мобильные про-цессоры от Qualcomm. Новые чипсеты разработаны, чтобы отвечать требова-ниям следующего поколения вычисли-тельных и развлекательных устройств при одновременном снижении энерго-потребления.

Спецификация чипов:{ 2,5 ГГц четырехядерный процессор,{ четырехядерное графическое

ядро Adreno 320, которое позволит создавать игры, не уступающие по качеству консольным,

{ поддержка 3G/LTE,{ поддержка Wi-Fi, GPS, Bluetooth и

NFC,{ поддержка видео 1080p (Dolby),{ поддержка стереоскопического 3D.

На смартфонах под управлением Win-dows Phone мы вряд ли увидим такие чипсеты в уже следующем году. Но воз-можно через 1,5-2 года такие устрой-ства станут привычным явлением.

Несмотря на то, что в настоящее время единственным производителем чипсе-

тов для Windows Phone является Qualcomm, дру- гие компании также про-являют интерес к плат-форме. Дженсен Хуанг (Jen-Hsun Huang), испол- нительный директор Nvi-dia, заявил, что одним из наиболее значимых на-правлений деятельности компании станет разра-ботка чипов специально оптимизированных под

Windows 8 (на планшетах). Он также отметил:

«Если в вашу стратегию не входят мобильные технологии, вы отстали от жизни. Если вы ничего не знаете о мо-бильных процессорах, вы отстали на 7 лет».

Для усиления позиций в этой области Nvidia в мае этого года приобрела ком-панию Icera, производителя мобильных модулей связи.

Во время конференции Citi Technology Conference в сеть утекла дорожная карта Nvidia. Судя по картинке, произ-водитель электроники окончательно утвердился в своих планах касательно Windows Phone. В 2013 году должен появиться чип Tegra+Icera, ориентиро-ванный на рынок смартфонов. Скорее всего, он будет выполнен по 28 нм тех-нологии и будет поддерживать возмож-ности 2G/3G/4G коммуникаций.

Кроме Nvidia о своих планах на Win-dows Phone заявила ком-пания ST-Ericsson. Еще в мае этого года Карло Бо-зотти (Carlo Bozotti), ис-полнительный директор ST-Ericsson, дал интер-вью журналу Forbes. Бо-зотти сообщил, что ком-пания собирается стать одним из двух производителей чипсе-тов для Windows Phone.

Первыми смартфонами на базе чипсе-тов ST-Ericsson должны стать устрой-ства от Nokia. Они будут оборудованы чипсетом U8500.

Чипсет U8500 содержит двуядерный ARM-процессор Cortex A9 и графиче-ское ядро ARM Mali 400. Специфика-ция:{ поддержка видео 1080p,{ поддержка нескольких кодеков

(H264 HP, VC-1, MPEG-4),{ сенсорный дисплей высокого раз-

решения (до WXGA),{ возможность отрисовки изображе-

ний одновременно на двух диспле-ях (разрешением до XGA),

{ поддержка стереоскопического 3D,{ поддержка двух камер: основной с

разрешением до 20 Мп (ISP) и до-полнительной до 5 Мп,

{ Wi-Fi, Bluetooth, GPS, FM-радио, USB 2.0, HDMI-выход,

{ поддержка одновременной уста-

новки нескольких операционных систем,

{ опциональная поддержка мобиль-ных телевизионных стандартов.

Как уже стало известно, первые смарт-фоны Nokia построены на базе чипсе-та Qualcomm Snapdragon. Однако со-всем недавно Жиль Делфасси (Gilles Delfassy), президент и исполнительный директор ST-Ericsson, заявил, что в планы компании все еще входит со-трудничество с Nokia:

«Мы рады, что компания Nokia выбра-ла нас ключевым партнером по про-изводству Windows-смартфонов. Это соответствует нашей глобальной цели – присутствие во всех сегментах рынка и на всех операционных системах. Наши платформы NovaThor продолжают на-бирать обороты, поскольку они позво-ляют нашим клиентам создавать хоро-шие смартфоны».

Все три чипа NovaThor: U9500, U8500 и U5500, содержат двуядерные про-цессоры. К концу 2012 года должна появиться обновленная платформа Windows Phone 8 Apollo, и для этой версии системы ST-Ericsson планирует производить свои чипы.

Как известно, все смартфоны на базе Windows Phone не имеют дополнитель-ного слота карты памяти (за исключе-нием линейки Samsung Focus). По этой причине пользователи довольствуются только теми чипами, которые уже уста-новлены в устройствах. В настоящее

время в смартфоны устанав-ливается два типа памяти: iNAND и microSD. Микросхе-мы iNAND, произведенные компанией SanDisk, установ-лены в устройствах первой волны от LG, Samsung, а так-же в Nokia Lumia 800 и HTC Titan. В остальных телефонах

стоят флеш-карты microSD.

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

***

Смартфоны на базе Windows Phone не отличаются особым разнообразием внутренней начинки. Однако со сво-ими задачами чипсеты справляются: операционная система работает очень быстро и плавно. Вместе с тем срок работы без подзарядки аккумулятора оставляет желать лучшего, большин-ство устройств под нагрузкой «живут» менее суток. В будущем ожидается переход на многоядерные чипы, благо-даря этому должно снизиться энерго-потребление. Кроме того, появление на рынке чипсетов новых игроков может расширить линейку WP-смартфонов и повысить их конкурентоспособность. n

ST-Ericsson со-бирается стать одним из двух производителей чипсетов для Windows Phone.

Page 73: 12 (04) MSDeveloperRU

Рекл

ама

Сайт журнала MSDeveloper.RU

Каждый день свежие новости

Каждый месяц новый номер журнала

Блоги пользователей

Система личных сообщений

Большой тематический форум

Календарь важных событий

Стена друзей

Подборка книг

Горячие вакансии

Бесплатная подписка на журнал