Инициализация DTO на стороне сервера при использовании служб RIA - PullRequest
0 голосов
/ 04 марта 2011

Допустим, у вас есть объект домена с бизнес-логикой для инициализации значений по умолчанию. Э.Г.

class User : IUser, Entity
{
  public User()
  {
    StartDate = DateTime.Now;
    EndDate = StartDate.AddDays(3); // This value could be user-configured.
  }
  public DateTime StartDate { get; set; }
  public DateTime EndDate { get; set; }
}

Используя службы RIA, DTO, который будет сгенерирован, конечно же, не содержит никакой логики, только общедоступные свойства. Это означает, что когда клиент (например, приложение Silverlight) отображает диалоговое окно «Создать нового пользователя», он не сможет заполнить поля какими-либо значениями по умолчанию (без, конечно, дублирования бизнес-логики на клиенте).

В попытке добиться этого я создал новый DTO (UserDTO) и запрос в моем UserDomainService:

// Construct a new domain entity and then convert to DTO
public UserDTO CreateNewUser()
{
  var user = new User(); // Business logic has now been executed.
  return new UserDTO(user);
}

Это позволяет клиенту заполнять поля значениями по умолчанию, однако, когда приходит время добавить вновь созданного пользователя, RIA уже добавила UserDTO в свою внутреннюю коллекцию сущностей, поэтому вы не можете вызывать .Add в своем домене. контекст. Вы все еще можете просто вызвать SubmitChanges, что вызовет метод [Update], однако это, похоже, идет вразрез с тем, как предполагается использовать службы RIA (то есть вы не должны выполнять операцию INSERT в ОБНОВЛЕНИЕ метода).

Достижим ли этот сценарий (т. Е. Создание DTO на стороне сервера) в службах RIA?

1 Ответ

1 голос
/ 05 марта 2011

Я не знаю, как выглядит ваша бизнес-логика, но если бы вы использовали общий метод для сохранения объектов (новых или измененных) на сервере, вы бы не смогли различить этот метод, будь то измененный объект или действительно новый.

Пример на сервере:

[Insert]
public void InsertUser(UserDTO user)
{
  this.SaveUser(user);
}

[Update]
public void UpdateUser(UserDTO user)
{
  this.SaveUser(user);
}

Вы можете добавить свойство своему пользователю (или базовому классу, если он у вас есть):

public class UserDTO
{
  [...]

  // only set this within the constructor, 
  // unfortunately it cannot be "private set", because of RIA Services
  public bool IsNewEntity { get; set; }
}

В вашем методе SaveUser используйте этот флаг:

private void SaveUser(UserDTO user)
{
  if (user.IsNewEntity)
  {
    // do something with a new user
  }
  else 
  {
    // do something with an existing user
  }
}

Тогда конструктор для UserDTO будет:

public UserDTO()
{
  this.IsNewEntity = true;
}

Я знаю, это выглядит немного тривиально, но я не знаю более "изящного" способа.

...