Alexey's profileLife vs. ProgrammingPhotosBlogListsMore ![]() | Help |
|
February 28 Visual Studio "Orcas" - мартовский CTPЕще не настал март, как уже вышел обещанный CTP новой Visual Studio, о которой я рассказывал здесь. Скачать можно как образ для Virtual PC (сам Virtual PC бесплатен, если кто не помнит), так и "обычный" инсталляционный пакет. Изменений ОЧЕНЬ много, да я уже давал ссылку на видео с некоторыми из них... February 26 CAB + WPF23-го февраля, видимо в качестве праздничного подарка, был выпущен релиз Composite Application Block, который поддерживает WPF. Ура! Пока создатели SmartClient Software Factory грозятся выпустить в конце апреля новую версию их продукта, которая будет содержать инструменты для добавления View, использующих WPF (и еще нескольких новых фич), CAB с поддержкой WPF можно скачать здесь: http://www.codeplex.com/wpfcab Для работы с ним нужно:
Все, проект WPF CAB готов. Дальше все как обычно, кроме того, что вместо WinForms можно использовать WPF для создания View. Кстати, если сейчас запустить приложение, то у него даже не будет окна. Для того, чтобы исправить этот "недостаток", нужно создать новую WPF-форму с именем, скажем, ShellWinfow.xaml и переопределить известный метод в ShellApplication: protected override void AfterShellCreated(){ base.AfterShellCreated(); ShellWindow mainWindow = RootWorkItem.Items.AddNew<ShellWindow>(); Shell.MainWindow = mainWindow; mainWindow.Show(); } Ну и еще одна "фича". В тех элементах, где планируется использование воркспейсов (DeckWorkspace, TabWorkspace, etc), в заголовок можно добавить следующий атрибут: xmlns:cab="http://schemas.microsoft.com/cab/wpf" <cab:DeckWorkspace x:Name="headerWorkspace"/> В остальном работа с CAB не изменилась. Более подробно можно посмотреть в примере (BankShell), который теперь тоже "переведен" на CAB WPF. February 24 Бесплатный курс ASP.NET AJAXМожно получить здесь: ASP.NET AJAX Free Course Как сказано в описании курса, требования к слушателям такие:
Так же рекомендуется:
Technorati tags: ASP.NET AJAX, AJAX February 20 ОбновленияПара полезных обновлений :) Вышел ServicePack 2 для MS SQL Server. Скачать можно здесь:
И второе: обновился Reflector. Полезный инструмент, если кто не знает ;) Скачать можно тут: Reflector 5.0 И вот тут: Reflector 5.0 New Features обязательно посмотрите презентацию о новых возможностях. А то будет как в анекдоте: "А что, можно было?!" :) February 17 M-V-P в Composite Application BlocksM-V-P (Model-View-Presenter) - это разновидность шаблона M-V-C (Model-View-Controller) с некоторыми существенными отличиями. Так же я не буду останавливаться на той части триады, которая называется Model. Полагаю, что с ней и так все понятно, так как эта часть в принципе не осведомлена о двух других, может существовать и без них. К тому же отличий от M-V-C в данном случае нет. Я остановлюсь на реализации View и Presenter. Справедливости ради нужно отметить, что Composite UI Application Block предлагает именно M-V-C, но при работе со Smart Client Software Factory вы будете общаться именно с M-V-P. Класс презентера (как и некоторые другие) не являются частью CAB, но будут созданы фабрикой в общем модуле вашего приложения. M-V-P в данном случае предполагает наличие View - пользовательского интерфейса и наличие Presenter'а, который содержит логику работы пользователя над моделью. То есть, мы, к примеру, имеем:
В коде это выглядит так:
Отсюда видно, что при создании экземпляря CustomerView ObjectBuilder создает экземплярCustomerViewPresenter, ссылка на который теперь доступна внутри CustomerView. Сам же презентер получает ссылку на экземпляр, реализующий известный ему интерфейс, поэтому ему все равно, какой тип пользовательского интерфейса скрывается за ICustomerView. Важно отметить то, что в случае M-V-P слой View сам обрабатывает пользовательский ввод и "уведомляет" презентер о необходимости получить/обработать данные модели, а так же о своем состоянии. В указанном примере View уведомляет Presenter о том, что он загружен и готов к работе (событие OnLoad в CustomerView). Презентер же, выполнив какие-то действия (например, получив от ICustomerService экземпляр класса Customer), сообщает View о необходимости отобразить информацию об этом кастомере. Здесь очень важным является тот момент, что View никакой информацией о логике Presenter'а не располагает, поэтому реализация метода ShowCustomerInfo делается потокобезопасной. На самом деле, Presenter может начать обрабатывать данные асинхронно для того, чтобы пользовательский интерфейс не блокировался на время работы. Пока ведется обработка данных, Presenter может "просить" View информировать пользователя о прогрессе и лишь после окончания обработки вызвать метод ShowCustomerInfo. Поэтому View должен быть готов к тому, что практически любой вызов от презентера придет из контекста другого потока, реализуя методы интерфейса ICustomerView потокобезопасными. На самом деле, это очень простая схема и именно так и нужно делать всегда: View лишь уведомляет Presenter о том, что пользователь захотел сделать что-то (например, вызывая _presenter.ApproveCustomer). View не в праве расчитывать на то, что Presenter ответит немедленно, вернув какой-то результат. Строго говоря, результаты вообще не в компетенции View, View не в праве решать, что делать с результатом. Вместо этого обработкой данных и получением результата занимается Presenter и после того, как операция выполнена, просто заставляет View сделать что-то другое. Такой подход позволяет нам получить следующие плюсы:
Ко всему этому писать (и поддерживать!) код легко и приятно (а то иной раз просто хочется запустить мышкой в монитор, разбирая очередные 350 спагетти-строк в _button1_Click). Пользуйтесь шаблонами проектирования, в них мудрость :) Возьмите "полуфабрикаты" в виде Composite Application Blocks, возьмите Software Factories - и они помогут вам придерживаться "правильного" пути. February 16 Сервисы в Composite Application BlocksСегодня немного расскажу об архитектуре Composite Application Blocks (Web и UI) и о том, как ее использовать "во благо". Речь в основном пойдет о двух фундаментальных вещах: сервисах и шаблоне проектирования M-V-P (Model-View-Presenter). В процессе работы над (любым) программным продуктом всегда хочется сделать так, чтобы отдельные части этого продукта, работая вместе "как часы", при этом как можно меньше зависели друг от друга. Для того, чтобы работа над одной из частей никак не затрагивала другие части или чтобы легко можно было вообще заменить одну из частей так, чтобы остальные части об этом ничего не узнали. Эта проблема называется "связанностью" и решение ее тем лучше, чем меньше различные части системы знают о том, как реализованы другие. Слабой связанности в Composite Application Blocks можно добиваться посредством создания сервисов. О том, как это реализуется. Например, мы определим интерфейсы ISourceControlService и IProgressService в общей библиотеке, чтобы все части приложения имели к ним доступ. После этого мы можем создать модуль SourceSaveVersionController, в котором создать класс SourceSaveService : ISourceControlService, которая будет работать работать с Microsoft SourceSave. Services.AddNew<SourceSaveService, ISourceControlService>(); С этого момента из любой части приложения мы можем обратиться к сервису, отвечающему за контроль версий, получить экземпляр, реализующий ISourceControlService и даже не задумываться о том, с какой именно системой контроля версий мы имеем дело: ISourceControlService scControl = Services.Get<ISourceControlService>(); И теперь если мы заменим SourceSaveVersionController на, скажем, ClearCaseVersionController с соответствующей реализацией ISourceControlService, то для всего остального приложения эта смена пройдет более чем прозрачно. Потому, что остальное приложение знать не знает ни про какие модули и реализации, оно общается только с известным ему интерфейсом. Для IProgressService можно поступить еще хитрее: реализовать этот интерфейс в главной форме приложения и зарегистрировать ее саму как сервис типа IProgressService. А можно сделать как-то иначе, придумать что-то другое, ведь уже стало понятно, что остальному коду совершенно безразлично то, кто предстанет перед ними под личиной IProgressService и как он будет выполнять свою работу :) Сама работа с сервисами в Composite Application Blocks тоже очень удобна. [Microsoft.Practices.CompositeUI. Service(typeof(IComponentsProvider))]public class AccessComponentsProvider : IComponentsProvider {.....} В этом случае при загрузке модуля экземпляр сервиса будет автоматически создан и зарегистрирован. Там, где нам необходимо общаться с сервисами, и в CAB и в Composite Web AB можно сделать так: [ ServiceDependency]public IAuthorizationService AuthService { get { return _authService; } set { _authService = value; } } ObjectBuilder сам найдет для вас подходящий сервис IAuthorizationService (если, конечно, он был зарегистрирован) и вызовет присвоит ссылку на него свойству AuthService. В случае, если нужный сервис зарегистрирован не был, вы получите null. Однако, в конструктор аттрибута ServiceDependency можно передать булевый параметр для того, чтобы ObjectBuilder возбуждал исключение если сервис найти не удается. В заключение хотел бы еще раз подчеркнуть: всю функциональность, которую можно сделать сервисом, настоятельно рекомендую делать именно сервисом. Это позволяет добиться большой гибкости за счет отделения интерфейса от реализации и легко поддерживается. Используйте сервисы - и да будет вам счастье :) February 15 Web Client Software Factory и Web App ProjectНеудобством Web Client Software Factory Со вчерашнего дня эту фабрику можно "научить" работать и с Web Application Project. Сделать это можно так:
Все, теперь можно создавать Web Client Project'ы с использованием Web Application Project. Что не может не радовать. Оригинальная инструкция здесь: http://www.codeplex.com/websf/Wiki/View.aspx?title=Web%20Application%20Project%20Guidance%20Package February 05 Video Of Scott Guthrie's Newest PresentationTom Mertens выложил видео с бельгийской User Group, на которой выступал Scott Guthrie. Посмотреть можно здесь: К сожалению, смотреть можно только онлайн, так как расшарить WMV Том сейчас почему-то не может, как мы его об этом ни просили :) February 03 К вопросу о String.EmptyОлег Михайлик и Гайдар затеяли разбирательство на тему того, почему String.Empty и "" равны или не равны друг другу. Подробные объяснения от Олега можно прочесть тут: http://blogs.gotdotnet.ru/personal/mihailik/CommentView.aspx?guid=2F1AF381-0EF6-4F8E-97F9-28CFB9F2162B Добавить хотелось только то, что у Рихтера есть и вторая книжка (так и вспоминается КВН: "букварь, вторая и синяя" :)). Так вот в ней описано как интернирование строк в .NET Framework 2.0 и атрибут CompilationRelaxions, так и то, почему не стоит ему доверять. Я просто процитирую:
Вот такие вот пироги, вот и объяснение того, почему константа String.Empty в mscorlib не интернирована. Так что тот же самый Рихтер прав: не стоит закладываться на то, интернированы ли строки, или нет. С другой стороны, мало кто, думаю, пользуется сравнением строк через ReferenceEquals :) Оркас: срокиДа, в прошлом постинге я забыл сказать про сроки. Со слов Скотта тот CTP, что был продемонстрирован на UserGroup, можно будет скачать примерно в конце февраля - в первой неделе марта. Официальная бета-версия должна выйти в конце весны. Ну а в целом .NET Framework 3.5 и Visual Studio "Orcas" покинут стены Майкрософт в 2007-м году, точнее сроков названо не было. February 02 "Orcas" и ASP.NET Ajax "от производителя"1-го февраля в бельгийском городе Mechelen (20 км. от Брюсселя) была проведена юбилейная (1-го февраля группе исполнился ровно год) встреча Visual Studio User Group, главным и единственным докладчиком на которой был Microsoft General Manager Scott Guthrie.
Скотт - это человек, который непосредственно принимал участие в проектировании и разработке ASP.NET, вложил огромный вклад в развитие .NET в целом и CLR в частности. В настоящее время он руководит командами разработки CLR, ASP.NET, WinForms, Visual Studio. Кроме того, он замечательный докладчик, которого можно слушать, слушать и слушать... Некоторые самые интересные факты я постараюсь описать тут (никогда не был на встречах UserGroup даже в России, а на бельгийскую занесло). Итак, что же такое "Orcas"? "Orcas" - это следующее поколение Visual Studio и .NET Framework 3.5. Дальше читайте на http://alexey.raga.name, сюда что-то не могу ничего запостить из своего блог-клиента. |
|
|