使用RIA服务时在服务器端初始化DTO

时间:2011-03-04 04:43:08

标签: silverlight wcf-ria-services dto

假设您有一个具有业务逻辑的域实体,用于初始化其默认值。 E.g。

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应用程序)显示“创建新用户”时对话框,它将无法使用任何默认值填充字段(当然,不会复制客户端上的业务逻辑)。

为了实现这一目标,我在UserDomainService中创建了新的DTO(UserDTO)和查询:

// 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添加到其内部维护的实体集合中,因此您无法调用。添加您的域上下文。您仍然可以调用SubmitChanges,这将触发[Update]方法被调用,但是这似乎与RIA服务应该如何使用有关(即您不应该进行INSERT操作)在UPDATE方法中)。

这种情况(即DTO的服务器端创建)是否可以在RIA服务中实现?

1 个答案:

答案 0 :(得分:1)

我不知道您的业务逻辑是什么样的,但如果您使用常用方法来保存服务器上的对象(无论是新的还是已修改的),那么您可以在该方法中区分对象,无论它是否是修改过的对象或真正的新对象。

服务器上的示例:

[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;
}

我知道,这看起来有点微不足道,但我不知道更“优雅”的方式。