В декабре прошлого года я написал пост по названием “Программирование на .NET: С чего начать?” на тему того, чтобы почитать начинающим разработчикам на платформе .NET. С того момента прошло достаточное количество времени и могло появиться желание или необходимость, начать писать веб-приложения на основе технологиеи ASP.NET. Не важно, будет это ASP.NET Webforms или ASP.NET MVC - в любом случаем, знание одной технологии не мешает познакомиться с другой. Далее я приведу список книг/блогов, которые рекомендую для знакомства с веб-разработкой на основе .NET Framework.

  • Начну с книги Дино Эспозито “Introducing Microsoft ASP.Net 2.0” - отличное введение в ASP.NET 2.0. Несмотря на то, что этот замечательный автор уже написал книгу по ASP.NET 3.5, эта книга не теряет соей актуальности и служит отличным введением в мир веб-разработки на основе технологий от Microsoft.
  • Книга “Programming Microsoft ASP.NET 3.5" является хорошим продлолжением предыдущей и не нуждается в комментариях. Добавлю лишь одно: некоторые считают что эти две книги все-равно что книга Дж. Рихтера CLR via C#.
  • Marco Bellinaso, “ASP.NET 2.0 Website Programming: Problem - Design - Solution” - книга, которая почетное место на моей книжной полке. Книга описывает процесс создания сайта под названием BeerHouse Project от начала и до конца. Если что-то непонятно, то всегда можно посмотреть исходники этого проекта. Отличная книга для начинающих, чтобы познакомиться с процессом создания сайта от начала и до конца.
  • Следующая книга от сразу двух авторов Matthew MacDonald и Adam Freeman имеет название “Pro ASP.NET 4 in C# 2010”. Я читал более старое название про ASP.NET 2.0. В книге достаточно подробно описывается технология ASP.NET, но читать ее нужно когда базовые знания уже есть.

Технология ASP.NET MVC более молодая и выбор книг значительно меньше. Большинство из них написаны про первую версию этого фреймворки и из-за значительных изменений настоятельно рекомендую читать книги по актуальной на сегодняшний день версии 2.0.
Это такие книги, как:

  • "Pro ASP.NET MVC 2 Framework" от Steven Sanderson - очень подробно и понятно написаны как основы, так и достаточно продвинутые вещи о ASP.NET MVC.
  • "ASP.NET MVC 2 in Action" ) от сразу пяти авторов. Если коротко, то я еще не встречал ни одной книги из этой серии, которая бы меня не заинтересовали и после прочтения которой я бы пожалел о потраченном времени.
  • Еще есть книга “ASP.NET MVC Framework” по ASP.NET MVC 2.0 от русских авторов Гайдара Магданурова и Владимира Юнева. Т.к. книгу только пролистал на балке, то никаких комметариев о ней писать не буду за исключением того, что она вполне годиться для введения в данную технологию.

С книгами закончили, теперь пройдемся по списку веб-ресурсов, RSS которых я регулярно читаю:

  • Сайт http://www.asp.net/ от Microsoft. Название говорит само за себя. Отличный ресурс с форумами, блогами, вики, ссылками на различные opensource приложения. Отдельно хочу выделить раздел с обучающим видео. Это лучше увидеть самому! Единственным их недостатком является то, что они могут ввести в ошибочное заблуждение, что разработка любого сайта - очень и очень простое занятие. В остальном - обязательно смотреть начинающим веб-разработчикам.
  • http://weblogs.asp.net/scottgu/ - блог Скота Гатри. Его должность решил не переводить, а процитировать с его блога:
    "My name is Scott Guthrie, and I am a Corporate Vice President in the Microsoft Developer Division. I run the development teams that build the following products/technologies: CLR and the core .NET Base Class Libraries, ASP.NET, Silverlight, WPF, IIS 7.0, Visual Studio Tools for ASP.NET, WPF, Silverlight and Mobile". Отличные технические посты о самых новых технологиях! Очень часто после публикации очередного поста проходит не одна неделя/месяц до того, как очередная технология/приложение станет доступным для разработчиков.
  • http://dev.net.ua/ и http://msug.vn.ua/ - сайты харьковской и винницкой .NET User Group - не только об asp.net, но и о других технологиях Microsoft.
  • http://www.nikhilk.net/ - Nikhil Kothari's Weblog - блог разработчика из Microsoft, посвященный веб-технологиям.
  • И последнее: MSDN - без него сложно представить жизь разработчика.

Продолжение следует. В следующем посте из серии для начинающих (веб)разработчиков я расскажу о том, что необходимо знать любому разработчику на платформе ASP.NET.


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

Ситуация была довольно таки простая: есть некий wizard, шаги которого хранятся в поле типа Stack для удобного перемещения вперёд-назад. Естественно, в зависимости от текущего номера шага, нужно было выполнять определённые действия. И вот, после очередного багфикса, пришлось с помощь дебаггера разбираться что же там происходит... Но, при дебагге время от времени (в начале мне было абсолютно непонятно из-за чего это происходит) я получал: System.InvalidOperationException: Stack empty. И это при том, что без дебаггера всё работало! Чтоб разобраться в чем дело, я решил написать маленькое консольное приложение (исходники, как всегда, прикреплены к посту), которое состояло из объявления стека, его наполнения и свойства класса StackItem:

 

Те, кто сталкивался с этим раньше, наверное, уже поняли в чем проблема. Запускаем дебаггер, и после наполнения стека смотрим значения свойства StackItem:

 

Второй раз смотрим значения свойства StackItem:

И здесь произошло самое интересное: при просмотре значения свойства дебаггер выполняет весь код, который находится в конструкции get. Таким образом, при каждом просмотре зачения свойства StackItem, в нашем стеке находилось все меньше и меньше данных. Возможно, для кого-то этот подход и является вполне логичным и очевидным, но не для меня. Ведь могли же в Microsoft предусмотреть это? Но нет, теперь у нас есть такая фича дебаггера, или баг...

А пока, для дебагга подобного кода, приходится использовать конструкцию вида:

 

В этом случае, если переменной i не присвоить другого значения, но она всегда будет хранить в себе число 5.

P.S. Проверял как в VS2008, так и в VS2010. Скорее всего, это фича такая...

DebuggerTest.rar (2.74 kb)


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

P.S. Для запуска проекта необходима Visual Studio 2010 и IronPython 2.6.1. Также использовалась библиотека json.codeplex.com/.

Introducing_to_DLR.ppt (352.00 kb)

IntroducingToDLR.rar (2.25 mb)


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

Я и сам придумал не один способ, как обмениваться данными между серверной и клиентской частью контрола. Но всегда догадывался, что есть более простой и "правильный" путь, особенно, когда смотрел на реализацию контролов из набора AjaxControlToolkit,

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

 

 

  • В методе GetScriptDescriptors() мы создаём дескрипторы в которых говорим какие клиентские свойства должны быть у контрола.
  • Метод GetScriptReferences() возвращает список клиентских скриптов, которые нам нужны и будут автоматически загружены с помощью ScriptManager.
С серверной стороной мы практически закончили, осталось только добавить несколько строк в обработчики событий OnPreRender и Render:

 

С серверной стороной закончили. Теперь осталось совсем немного написать на JavaScript. Как всегда, большую часть за нас сделала Microsoft. Добавляем в проект js-файл типа AJAX ClientControl:

Для нас создастса уже готовый прототик контрола, где нам останется только объявить все наши свойства, getters & setters для них, события и методы. 

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

Хочу заметить, что всё описанное выше без каких-либо изминений можно применять только для WebControl. Если же нужно сделать UserControl, то в нём нужно поместить какой-либо контейнер (e.g. <div id="container" runat="server"></div>) и при создании дескрипторов указывать ID контейнера, иначе вы получите клиентскуб ошибку что не к сему привязать js объект.

Более подробно о каждом шаге можно почитать по ссылке http://en.csharp-online.net/Creating_Custom_ASP.NET_AJAX_Client_Controls—IScriptControl.GetScriptDescriptors_Method и в MSDN.

ScriptControlTest.zip (7.95 kb)


Случилось так, что на работе попросили составить список из того, что нужно почитать/скачать/установить студентам, которые хотят писать на всеми любимом языке программирования C#. Решили, что раз они (студенты) этим интересуются, то вопрос "а оно нам(им) надо пропускаем.

Для начала начала необходимо установить сам .NET framework и какуе-то IDE. C IDE вариантов не много: или бесплатные express версии (http://www.microsoft.com/exPress/), или trial полнофункциональной Visual Studio (http://www.microsoft.com/visualstudio/en-us/default.mspx). Что дальше делать с триальной версией - каждый решает сам, но для студентов полно всяких програм, где можно получить всё это бессплатно и, главное, легально.

При установки Visual Studio рекомендую сразу поставить SQL Server Express Edition (http://www.microsoft.com/express/sql/default.aspx), т.к. я с трудом представляю какое более-менее большое приложение может работать без базы данных.

Из-за того, что упор делается на web-разработку, разу ставим Microsoft Web Platform Installer (http://www.microsoft.com/web/downloads/platform.aspx) - в нем уже есть всё нужное для разработки на платформе ASP.NET.

Всё установили, настроили - теперь можно писать свою первую (или не первую) программу на .NET. Вот только ещё не известно как писать! Предлагаю список литературы.

On-line сточники:

  • MSDN (Microsoft Developers Network): http://msdn.microsoft.com/en-us/default.aspx или русская версия http://msdn.microsoft.com/ru-ru/default.aspx. Там действительно есть всё, но использовать его в качестве учебника трудно и неудобно.
  • http://www.asp.net/learn/ - много разного обучающего видео, демонстрирующего возможности ASP.NET. К каждому ролику можно скачать исходный код проекта, на случай, если что-то не получается. Только не стоит увлекаться: там показывают только самые(!) простые вещи, которые в больших приложения требуют хорошей обработки напильником.
  • http://www.asp.net/community/projects/ - Starter Kits – готовые приложения с исходниками. Не знаю что ещё можно об этом сказать. Очень полезная вещь.
  • Всевозможные блоги, форумы, сообщества. Их сейчас очень много, т.ч. я не считаю что нужно их сдесть перечислять, всё-равно кому-то что-то не понравится.
  • ...
Книги:
  • Эндрю Троелсен. Язык программирования С# 2008 и платформа .NET 3.5 - своеобразный букварь по C#. Многие рекомендуют начинать именно с него.
  • Книги по ASP.NET от Дино Эспозито - у него несклько книг, ориентированных на разный уровень читателей, каждый может выбрать себе книгу "по душе".
  • Джеффри Рихтер. CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C# - отличнай книга, обязательна к прочтению каждым разработчиком, который пишет на .NET. Только я очень не(!) рекомендую начинать именно с неё. У меня было "тяжелое детство": начинал с Рихтера, поэтому пришлось читать 2 или 3 раза, чтобы понять о чём он пишет.
  • ...
Для начала, наверное хватит. To be continued...

 


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

Первым делом я в свойствах проекта поменял свойство Platform Target (посже оказалось что это нужно сделать для всех проектов в solution):

 

 
Но после этих изменений ошибка "Can not load assembly ..." не пропала.  Следующим шагом пошел смотреть свойства solution и...
 
 
... и, с удивлением, обнаружил, что в качестве Target Platform для всех проектов стоит "Any CPU", вместо необходимого "x86". Пришлось идти в Configuration Manager и создавать ноую платформу для текущего solution.
 
 
Но и после всех этих танцев с бубном сайт не заработал. Тут я решил заглянуть в настройки IIS, попутно вспониная создателей Microsoft, .NET и их родственников: и это вы называете кроссплатформенной средой? Здесь меня тоже ждал сюрприз в качестве одного из параметров Application Pool'а, а именно - Enable 32-Bitt Applications, который, по умолчанию, чтоб его конечно же равен False.
 
 
Хорошо что хоть это помогло, иначе я уже был готов перустанавливать Windows и/или избавляться от старой библиотеки, которая использует COM(в нашем случае можно обойтись без этого).
 
P.S. Немного оффтопа. Стало интересно, как это всё сможет работать на x64 системах, который вовсю сейчас продвигаются Microsoft. Ещё интересно где обещанная мультиплатформенность .NET? IMHO, считаю что её нет она находится в зачаточном состоянии, т.к. всё ещё можно скомнилить сборку толоько под x86 или x64. Понимаю, что это делалось только для "нормального" запуска exe-файлов, но зачем же это было делать такой ценой?

PlatrormTestWeb.zip (10.01 kb)


Все же знают (или не все?), что .net, по умолчанию, хранит строки в юникоде. Так почему же  я во всех примерах вижу такой код?

 

byte[] byteArray = GetBytes();
var retval = Encoding.ASCII.GetString(byteArray);

 

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

 

"\u0000"\u0000a\u0000"\u0000:\u00002\u00000...." 

 

Тогда все начинают громко ругаться и рвать на себе волосы со словами: "Ну ведь работало же! Да и вот в этом(http://www.google.com.ua/search?rlz=1C1GGLS_enUA335US335&sourceid=chrome&ie=UTF-8&q=c%23+byte+array+to+string) примере так написано!".

Хорошо, если мысль о неправильной кодировке прийдёт сразу, а если нет... Сколько времени/нервов потритит разработчик, прежде чем всё станит на свои места?

вышеприведённый пример лучше заменить на:

byte[] byteArray = GetBytes();
var retval = Encoding.Unicode.GetString(byteArray); 

Или даже на:

 

byte[] byteArray = GetBytes();
var retval = Encoding.Default.GetString(byteArray); 

 

 

 



Вчера в Киеве прошла конференция Patterns & Practices Roadshow. Изначально она должна была пройти в офисе Microsoft Ukraine, но, т.к. было многожелающих, провели её в Киевском кукольном театре. Очень красивое место и здание. Из названия было понятно, что будет обсуждаться Enterprice Library (EntLib), Entity Framework и всем, что связано с P'n'P. Догадки подтвердил опубликованный список ресурсов. 

Началось всё со вступительного слова представителя компании Microsoft Ukraine. Хотя, на самом деле всё началось с регистрации, где нам вдали пакеты с анкетой, ручкой и каким-то учебником для ВУЗов на украинском языке и кофе.


Первый доклад имел гордое название "Patterns & practices – взгляд в будущее", автором которого был Ajoy Krishnamoorthy, ведущий специалист группы patterns & practices в Microsoft, а в прошлом - PM продукта Visual Studio Team System. Было небольшое введение на тему "что такое Patterns & Practices, EntLib".

 

Вторым на сцену вышел Don Smith, которого встретили бурными авациями в том числе и из-за его Mac Book Pro, на котором оказалась установленная Windows 7.


Тут доклады немного пеменялись местами и мы услышали  доклад "Руководство по архитектуре приложений: карта вашего путешествия", который должен был быть после обеда. Но хуже от этого не стало. Нам рассказали о "Application Architecture Guide", котором написано, что он создан для разработки решений на платформе .NET, но, по сути, может быть использован при использовании и других технологий. Это же нам подтвердил Дон. Application Architecture Guide рассазывает нам о высокоарзхитектурных решениях, не вдаваясь в подробности реализации конкретных частей приложений. Думаю, что это будет интересно не только архитекторам, но и всем разработчикам. Поэтому рекомендую прочесть этот почти 400-страничный мануал.

Следующим был доклад нашего земляка Григория Мельника (Grigori Melnik).

Началось с приветствия и фразы "решил не выпендриваться и говорить на русском" (дословно). Было интересно послушать про EntLib 5,в которой будет поддерживаться совместимость до 2-й версии. Таким образом, если вы испульзовалм более старую версию библиотеки, то вы практически без проблем перейдёте на EntLib 5. К сожалению, из-за большого количества вопросов, доклад получился не полным. Григорий успел рассказать в общих чертах об Enterprice Library и рассказал о таких её частях, как Logging и Unity. Очень хотелось послушать ещё о Exception Handling и Data Access, который не является очередной ORM. Эту тему немного затронули в другом докладе, посвященному доступу к данным.

Обед. После обеда снова появился Don Smith и с докладом "Современные методы доступа к данным: шаблоны и реализации". Опять был сделан упор не на конкретную реализицию, а на то, какие вообще могут быть DataLayer. Немного была затронута тема Entity Libraкy и  LINQ to SQL. Несколько примеров приложений с разными архитектурами data layer хорошо продемонстрировали то, что Дон рассказывал и показывал на слайдах. 

Подводя итог, хочу сказать что конференция понравилась, не жалко потраченных времени/денег. Докладчики хорошо разбираются в сути вопроса и, что немаловажно, не просто говорят какие их технологии классные и нужно использовать их, а просто говорят какие есть плюсы, а иногда и минусы, тех  или иных подходов. Не было сказано не одной фразы похожей на "это классно, используйте наши технологии". Всё было достаточно объективно. Что касается организации, то не было привычных всем футболок, зато в обмен назаполенную анкету давали флешку с материалами конференции, на которой, к слову, не оказалось показанных презентаций и примеров проггрмамм, которые использовали докладчики. Так же не было EntLib 5, которая ещё не вышла в RTM.

P.S. Mike Chaliy, спасибо за фото.


internal class LinqConnection: BaseDatabaseConnection
{

   /// <summary>
   /// Should never be called
   /// </summary>
   internal LinqConnection()
   {
       throw new Exception();
   }
   ...

 

Написали программисты из США. И это ещё далеко не самый плохой кусок кода в проекте....


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

 Рассмотрим такую ситуацию: у нас есть главная сборка (Main), сборка с утилитными классами (Utils) и 3-rd party логгер (Logger):

 

При этом Utils достался нам ещё со староко проекта и мы просто подключили его проект в наш solution, а логгер - соответствующий компонент из Microsoft Enterprise Library.
 
Решение этой задачи разбивается на следующие шаги:
  1. Добавляем в наш solution нужные нам проекты.
  2. Добавляем ссылки на проекты.
Почему-то, некоторые выбирают такой способ решения: выполняют шаг 1 - тут у нас только один способ сделать это (я не беру в счёт способ ручного редактирования *proj-файла), Build -> Rebuild Solution, и собственно добавление ссылки на проект путём добавления ссылки на dll:


В таком случае, если вам сильно повезёт и такого в вашем solution будет не много, достаточно будет сначала сделать Build -> Rebuild Solution, после чего всё заработает, а если не повезёт... А если не повезёт прийдётся ещё руками настраивать project dependecies и писать не менее захватывающий сценарий для билдов.
 
Теперь рассмотрим как это делать правильно:
Добавляем ссылку не на сборку, а на проект в solution:
 

 
После чего всё выглядит так:
 
Таким образом все зависимости на проекты выставляются автоматически и нам больше не нужен бубун для сборки solution и билдов.
 
Осталось подключись сборку с логгером. Но и здесь не всё так просто. В случае с Enterprise Library достаточно добавить ссылка на сборку из GAC:

У этого спосоа есть несколько недостатков: Enterprise Library должна быть установлена на всех машинах, где будет запускиться проект, и везде должна быть одна и таже версия. Второй недостаток хорошо ощёщается если использовать библиотеки, которые достаточно быстро развиваются и имеют множество версий (e.g. NUnit. AjaxControlToolkit, etc).
 
Я предпочитаю другой способ решения этой задачи (не могу сказать, что он не имеет недостатков, но, лично для меня, его преимущества имеют больший вес).
Все сторонние библиотеки кладутся в Source Control и уже на них ссылаются все проекты. Для удобства можно ещё создать папку в solution:

ReferencesSample.zip (76.14 kb)


e0ne's comments

A Web Developer's Blog!