Как разделять код между .Net и Silverlight-проектами. Часть 2
В прошлый раз мы разобрались, как разделять код между Silverlight и .NET-проектами на уровне исходников, при этом понимая два важных момента:
- Функциональность такого кода ограничена возможностями Silverlight.
- Если потребуется расширить этот код специфическими возможностями той или иной платформы, скорее всего, придется разделить код на две явные ветви.
Можно ли обойти эти ограничения и, оставаясь в пределах одного файла, указывать вещи, специфичные для одной из платформ — так, чтобы нужная ветвь выбиралась автоматически в процессе компиляции?
Да. Для этого есть условная компиляция.
Мы продолжим работать с предыдущим примером :)
Итак, что нужно сделать? Откройте свойства Silverlight-проекта: СodeSharingSL → Properties:
Дальше во вкладке “Build” вы увидите “Conditional compilation symbols” — “SILVERLIGHT”:
Это именно то, что нам нужно знать. При необходимости, можно задать другое название.
Теперь идем в наш класс Person и давайте изменим функциональность в случае компиляции под Silverlight. Я ограничусь банальным изменением размера символов (все будет UpperCase).
В реальности это может быть, к примеру, какая-нибудь валидация — тут могут быть разные варианты: от различий в обработке ошибок (и наличия соответствующего функционала) до разницы в удаленной валидации/проверке (Silverlight может проверять через http, а серверное приложение, к примеру, напрямую через БД или какой-то специальный сервис), вариантов масса :)
В итоге будем иметь:
public String LastName
{
get { return m_lastName; }
set
{
#if SILVERLIGHT
m_lastName = value.ToUpper();
#else
m_lastName = UpperCaseFirstLetter(value);
#endif
}
}
Хотелось бы подчеркнуть, что это манипуляции на уровне кода (текста), поэтому подобным орбазом можно выбирать, как участок кода внутри функции, так и реализацию всей функции и далее… далее…
Что получилось? Компилируем Silverlight-приложение:
Компилируем WPF-приложение:
Надеюсь, разница заметна :)
В каких случаях это можно и следует использовать? Каких-то особых рекомендаций нет, но важно, чтобы идея “оставаться в рамках одного файла” не стала самоцелью, противоречащей банальному удобству разработки.
Если содержимое файлов преимущественно остается общим, но в отдельных немногих случаях мы понимаем, что, к примеру, ту же самую функциональность под одной из платформ (полный .NET, WPF) можно оптимизировать (например, используя аппаратную поддержку), тогда это имеет смысл.
Если в отдельных немногих случаях разница обуславливается, к примеру, коренными различиями платформ и предоставляемой функциональностью (помятуя о том, что Silverlight .NET — подмножество полного .NET), тогда это имеет смысл.
Но если реализация под разные платформы начинает сильно расходиться, то о “разделении кода между .NET и Silverlight-проектам” говорить явно не приходится и стоит задуматься, не стоит ли это разнести в разные файлы, реазилующие, к примеру, один и тот же интрефейс.
Comments
- Anonymous
February 08, 2009
Итак, мы уже умеем делать две вещи: Разделять код между .NET и Silverlight-проектами на уровне исходников