Denis Gladkikh

outcoldman

My personal blog about software development

  • 20 Aug 2010
  • Silverlight, Dynamic, XAML, Silverlight 4, DataGrid, LightSwitch
  • 0 comments

lightswitch

Как и многие скачал я себе LightSwitch, недавно он стал доступен для MSDN подписчиков. Скачивал и устанавливал я его не просто так, чтобы посмотреть, а у меня в голове были уже идеи, как это можно было бы использовать в текущем проекте. Наш основной проект сейчас – это модульное Silverlight приложение, один из модулей – это административная часть с кучей редактируемых таблиц (буду называть их справочниками). Мне не хотелось делать отдельные представления на каждый справочник, потому я сделал механизм, который позволял просто заполнять DataGrid по имени таблицы и списку полей. Причем поля можно указываться и из таблиц, на которые есть ссылки (reference) из главной таблицы, на сервере построится правильный join. Так же реализовал свой DataForm, к сожалению стандартный расширить не получилось, из-за того что там были спрятаны некоторые необходимые методы и свойства, и помню, что в WPF эти свойства спрятаны не были, ну да ладно. В итоге, на сервер передаются объекты и построенные запросы: что нужно отобразить, что показать. То есть, чтобы добавить редактирование новой таблицы CronTask мне теперь необходимо сделать буквально следующее

<Views:ListEditControl>
  <Views:ListEditControl.DataContext>
    <ViewModel:ListEditViewModel MainTableName="CronTask" >
      <ViewModel:ListEditViewModel.MetadataColumns>
        <Controls:DynamicMetadataColumn HeaderText="Task Type" Column="Name" Table="TaskType" />
        <Controls:DynamicMetadataColumn HeaderText="Periodicity" Column="Periodicity"  />
        <Controls:DynamicMetadataColumn HeaderText="Is Active" Column="IsActive"  />
        <Controls:DynamicMetadataColumn HeaderText="Finish Only When Successful" Column="FinishOnlyWhenSuccessful"  />
        <Controls:DynamicMetadataColumn HeaderText="Company" Column="CompanyName" Table="DuneClientCompanies"  />
      </ViewModel:ListEditViewModel.MetadataColumns>
      <ViewModel:ListEditViewModel.MetadataFields>
        <Controls:DynamicMetadataField HeaderText="Task Type" Column="TaskTypeID" ReferenceShowingColumn="Name" />
        <Controls:DynamicMetadataField HeaderText="Periodicity" Column="Periodicity"  />
        <Controls:DynamicMetadataField HeaderText="Is Active" Column="IsActive"  />
        <Controls:DynamicMetadataField HeaderText="Finish Only When Successful" Column="FinishOnlyWhenSuccessful"  />
        <Controls:DynamicMetadataField HeaderText="Company" Column="CompanyID" ReferenceShowingColumn="CompanyName" />
      </ViewModel:ListEditViewModel.MetadataFields>
    </ViewModel:ListEditViewModel>
  </Views:ListEditControl.DataContext>
</Views:ListEditControl>

Это решение я писал еще на Silverlight 3, потому я особо не хочу вдаваться в подробности реализации, могу сказать только то, что сейчас я бы реализовал это немного по-другому, так как в Silverlight 4 уже есть динамические объекты (dynamic), а они бы сильно облегчили реализацию, и, скорее всего, мне бы удалось использовать стандартный DataForm. Так вот, таблиц для редактирования в админской части становится все больше, все больше таблиц нам нужно отображать для администраторов компаний, а это заказчики – для них нужно делать красиво. Необходимо делать все более юзабильнее и красивее, а понятно, что мое решение приходится постоянно сильно дорабатывать, и чем больше дизайнер старается, тем все ближе момент, когда эта реализация станет проигрывать по затраченному времени на обычную реализацию «в лоб». Так вот я сейчас искал замену этой реализации, и вариантов было несколько.

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

Второй – это сделать «в лоб», тогда у дизайнера появится прямая возможность редактировать пользовательские интерфейсы как угодно. Единственное, все-таки хочется по максимуму упростить себя жизнь при помощи ORM на сервере, вроде Entity Framework и сервисов, вроде WCF RIA Services. А на клиенте, что захочет дизайнер то и будет. По началу, конечно же, будут стандартные DataGrid и DataForm. Минусы тут ясны, любой новый справочник – это куча нового кода: перегенировать объекты Entity Framework, сервисов, добавить View и т.п., но, вроде все можно возложить на Visual Studio и может быть затраты будут не такие уж и большие.

Третий вариант – это сделать модуль на основе LightSwitch. Тут-то я вот и разочаровался в LightSwitch. Честно, по видео и первым попыткам обуздать этот продукт я был уже на 90% уверен, что, скорее всего, его и буду использовать для админской части, легко настраивается, легко строятся странички для редактирования справочников, все очень шустро, юзабильно – бери да пользуйся. Но не тут-то было, так просто внедрить это детище в свой продукт не получится, все спрятано от разработчика как можно дальше. Единственное, что честно сейчас можно редактировать – это методы форм: добавлять что-то на OnSaving, на OnSaved или какие-нибудь другие и все. Оно и понятно, начни править в серверном коде, так все начнет валиться, и все будут сваливать на продукт, что сырой и недоработанный. Понятное дело, что LightSwitch будет хорошо расширяем: будет возможность добавлять свои расширения и темы для него, но это будет разработка на основе LightSwitch, а не использование LightSwitch в своем приложении и мне не подходит. Код, что генерирует LightSwitch, я все же посмотрел через файловый менеджер (так же можно открывать файлы классов через Object Browser в Visual Studio) – поддерживать и править его точно не вариант.

Если есть вопросы к LightSwitch, но нет возможности его попробовать, можете задать тут – попробую проверить и дать ответ. Мне, как я и говорил в подкасте 2Гига, этот продукт пока что становится неинтересным (занятным, но все же неинтересным).

Comments