Отправка данных сетки с использованием сущностей nHibernate и DTO - PullRequest
2 голосов
/ 19 августа 2010

Мы используем nHibernate в нашей доменной модели и хотели бы создать DTO для отправки объектов через WCF во внешнее приложение, созданное с использованием шаблона MVVM (WPF / WinForms).У нас есть полный контроль над клиентом и сервером - и оба обновляются одновременно, поэтому управление версиями / кросс-платформенность не проблема.

Я вижу, как работает редактирование отдельных записей, однако я все еще не уверено лучшем способе отправки коллекций объектов по проводам.Затем DTO используется для заполнения сетки, где строки могут быть обновлены, удалены или добавлены.

Мой вопрос;Каков наилучший метод с использованием DTO и nHibernate для захвата вставки, обновлений и удалений в сценарии типа сетки / таблицы?

Спасибо.

(Наше приложение изначально использовало DataTables, где DataTable /DataRow отслеживал изменения и, используя GetChanges / Merge, вы могли передавать по проводам только то, что было изменено и нуждалось в обновлении - где вставки и удаления также хорошо отслеживались)

Ответы [ 2 ]

1 голос
/ 24 августа 2010

Скорее всего, я бы отправил контейнерный класс, который содержит новые и обновленные экземпляры и элементы для удаления.

Например:

class GridModificationsDto
{
  Dto[] NewOrUpdatedItems { get; set; }
  Identity[] DeletedItems { get; set; }
}

Когда элемент новый, он неУ меня нет идентификатора.Вы также можете иметь отдельный список для новых предметов.

Тогда вам нужно сделать что-то вроде этого:

foreach(Dto dto in modifications.NewOrUpdatedItems)
{
  if (dto.id == 0)
  {
    session.Save(DtoMapper.CreateEntity(dto));
  }
  else
  {
    Entity entity = session.Get<Entity>(dto.id);
    DtoMapper.Update(entity, dto);
  }
}

foreach(Identity identity in modifications.DeletedItems)
{
  session.Delete<Entity>(identity.id);
}

Я не знаю, как вы могли бы получить список измененных предметов впользовательский интерфейсЯ думал, что это будет доступно связыванием данных и событиями PropertyChanged и тому подобным.Если в этом нет ничего полезного, вам может понадобиться наследовать свой собственный элемент управления Grid.

0 голосов
/ 19 августа 2010

Вам потребуется привязка к источнику BindingSource, например:

dataGridView1.DataSource = _presenter.BindingSource;

У вас также будет некоторый интерфейс между вашим View и Presenter.

В вашем докладчике выВы получите IList<NHibernateResult>, где NHibernateResult - это класс со всеми вашими методами получения и установки для свойств, которые вы хотите вернуть.Это может быть пользовательский класс с ограниченными свойствами (например, столбцы) или класс вашей сущности.NHibernateResult не является реальным классом, а просто заполнителем для этого ответа.

Например (в докладчике),

private IList<OrdersResult> _bindingSource;

        public IList<OrdersResult> BindingSource
        {
            get
            {
                //_bindingSource = OrderDataControl.Instance.GetAll();
                _bindingSource = 
                    OrderDataControl.Instance.GetSimpleOrderList(_firstResult, _maxResult);
                return _bindingSource;
            }

            set
            {
                _bindingSource = value;
            }
        }

OrderDataControl является объектом доступа к данным или объектом передачи данных.Он взаимодействует с вашим SessionProvider и Respository (он же Model).

Этот уровень абстракции удаляет слой данных из презентатора и делает ваш взгляд совершенно глупым по поводу модели в целом.Он относит ваше представление только к событиям, связанным с пользовательским интерфейсом, таким как «Включен», «Видимый», «Цвета» и т. Д.

...