Jaa


Как разделять код между .Net и Silverlight-проектами. Часть 2

В прошлый раз мы разобрались, как разделять код между Silverlight и .NET-проектами на уровне исходников, при этом понимая два важных момента:

  1. Функциональность такого кода ограничена возможностями Silverlight.
  2. Если потребуется расширить этот код специфическими возможностями той или иной платформы, скорее всего, придется разделить код на две явные ветви.

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

 

Да. Для этого есть условная компиляция.

 

Мы продолжим работать с предыдущим примером :)

 

Итак, что нужно сделать? Откройте свойства Silverlight-проекта: СodeSharingSL → Properties:

image

Дальше во вкладке “Build” вы увидите “Conditional compilation symbols” — “SILVERLIGHT”:

image

Это именно то, что нам нужно знать. При необходимости, можно задать другое название.

 

Теперь идем в наш класс 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-приложение:

image

Компилируем WPF-приложение:

image

Надеюсь, разница заметна :)

 

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

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

Если в отдельных немногих случаях разница обуславливается, к примеру, коренными различиями платформ и предоставляемой функциональностью (помятуя о том, что Silverlight .NET — подмножество полного .NET), тогда это имеет смысл.

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

 

Исходники прилагаются.

Comments

  • Anonymous
    February 08, 2009
    Итак, мы уже умеем делать две вещи: Разделять код между .NET и Silverlight-проектами на уровне исходников