Здравствуй, Xamarin.Forms, или пост, запоздавший на 4 месяца

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

Меньше месяца назад, в июне 2014-го (да, заметка писалась еще в июле :)) ребята из Xamarin выпустили то самое, что от них ожидалось очень давно. Это — фреймворк для построения кроссплатформенного UI — Xamarin.Forms.
Такое решение — золотая середина между html-подобным интерфейсом, который выглядит ненативно на всех платформах, зато обладает на 100% общим кодом; и изначальным подходом Xamarin — где UI на каждой платформе полностью уникальный, отлично и естественно смотрится на всех устройствах, но требует разработки «с нуля» под каждую платформу.
Идея Xamarin.Forms в том, что многие базовые контролы пользовательского интерфейса так или иначе реализованы во всех системах (поддерживаются iOS/Android/WinPhone). Действительно, кнопки, надписи, поля ввода и переключатели есть везде. Xamarin выделил этот общий набор, собрал воедино все их свойства, и назвал эту абстракцию Xamarin.Forms. Из получившихся платформо-независимых классов можно строить интерфейс, а в результате под каждую платформу будет сгенерирован вполне естественный нативный UI с использованием «родных» компонентов.
Делать обзор функционала Forms через 5 месяцев после релиза слегка глуповато, так что я просто остановлюсь на некоторых плюсах и минусах, с которыми я успел столкнуться в процессе полу-продакшеновой практической эксплуатации Xamarin.Forms.
Continue reading

Universal App — кроссплатформенное счастье с #ifdef’ами и рефакторингом

Еще на конференции Build 2014 майкрософтовцы рассказали о новом типе проектов — Universal App. Естественно, на прошедшем DevCon 2014 я постарался разузнать побольше об этом типе проектов, и как он может помочь при разработке под iOS/Android.

Microsoft традиционно акцентирует внимание на том, что UniversalApp поможет повторно использовать кода между WinPhone и WinRT приложениями, не слишком афишируя то, что начиная с Xamarin 3.0 этот подход сработает и для iOS и Android приложений.
Давайте попробуем и посмотрим, что же у нас получится :)
Continue reading

Инъекция зависимостей и меняющиеся параметры в конструкторе

При использовании инъекции зависимостей у меня частенько возникают проблемы с конструкторами.
Посмотрим на простой пример класса — сервиса почтовой рассылки:

public class EmailSender
{
	public EmailSender(ISmtpClient smtpClient, string serverAddress)
	{
	}

	public void Send(string from, string to, string text)
	{
		
	}
}

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

Допустим, что у меня в проекте полная Инверсия Зависимостей и активно используются IoC-контейнеры. Какая возникает проблема?
ISmtpClient зарегистрирован в моем контейнере с ним проблем нет, но как сконфигурировать EmailSender адресом сервера? Непонятно.
Continue reading

Только React.js, только хардкор (aka долой Angular и Knockout)!

Последние годы только ленивый не писал о javascript-фреймворках. AngularJS/KnockoutJS/Backbone/Ember — выбирай на вкус :) Но, озадачившись выбором фреймворка для небольшого веб-приложения с год назад, оказалось, что серебряной пули в мире js все еще не придумали.
Backbone и Ember слишком низкоуровневы и многословны, Knockout расстраивает постоянными конвертациями данных в observable, AngularJS.. да, почему бы не попробовать Angular, подумал я тогда. Энгуляр обладал приятным синтаксисом, структура Контроллеров была более менее близка и понятна и всё шло хорошо, пока.. пока мы не уперлись в довольно стандартную для Angular проблему произодительности.
Continue reading

Видеозапись внутреннего семинара Rubius о тестировании

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

В итоге получилась очень большая дискуссия и очень мало конкретики, фактического материала, выводов и конкретных решений :) Но если кому-то интересно послушать галдеж на айти тематику — welcome :)

Строготипизированный доступ к UI-элементам в Xamarin.Android

Всем Андроид-разработчикам должен быть очень знаком код вроде:

private Button _myButton;
public Button MyButton { get { return _myButton ?? (_myButton =  this.FindViewById<button>(Resource.Id.MyButton)); } }

Все еще пишете это руками? Используете FindViewById? Если при этом вы еще и используете Xamarin — то у меня есть решение! :)
Continue reading

Эволюция Team Foundation Server

Вообще говоря, мое отношение к Team Foundation Server всегда было довольно негативным. Это подтверждал и мой собственный опыт, и бытующие легенды, что в ТФС взяли самые худшие составляющие (худший баг трекер, систему контроля версий, билд сервер) и с трудом слепили их в нечто единое :) Эти суждения были весьма небезоснавательны, и когда очередной проект мы начали вести в TFS, мой настрой к этой системе был весьма и весьма скептическим.
Continue reading

Запись доклада с DevPRO: «Единый код C#: разрабатываем для Web, Desktop, Android, Windows RT и iOS»

Наконец-то стали появляться первые видеозаписи с прошедшего 16 марта семинара DevPRO.

На семинаре я выступал с докладом о разработке мобильных приложений с использованием c#.

RavenDB в «одноразовых» приложениях

На выходных попробовал RavenDB на небольшой задаче обработки массива документов. Документов было не очень много — порядка 50К, их обработка — задача разовая, но её длительность получалась однозначно порядка 10 часов, плюс всё это отлично параллелилось.
Поэтому возникла мысль загнать все эти документы в БД, чтобы без проблем сохранять промежуточные результаты и не волноваться за exception’ы, безвозвратно прерывающие обработку 10-часового процесса в самом конце :)
Raven-Embedded видился неплохим кандидатом для такого использования, поскольку позволял не париться с маппингами, быстро «установить» БД, просто добавив nuget пакет, позволял динамически добавлять в документы новые структуры данных (результаты обработок) ну и по идее должен был быстро работать :)
Что же из всего этого получилось?
Continue reading

Публикация исходников вместе с nuget — плюс исходники Av.Infrastructure.Web

На выходных (где-то с месяц назад, когда я только взялся за этот пост) наконец-то дошли руки до публикации исходников своей «инфраструктурной» библиотеки. По правде говоря, я это собирался сделать достаточно давно, но насущной необходимости не было, да и сейчас наврядли кому-то понадобиться заточенная по большому счету под личные нужды одна из сотен тысяч других библиотек-собраний-всяких-мелочей, однако публикация исходников вместе со своими собственными nuget-пакетами таки может кому-нибудь пригодиться.
Continue reading