假设您有一个具有业务逻辑的域实体,用于初始化其默认值。 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服务中实现?
答案 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;
}
我知道,这看起来有点微不足道,但我不知道更“优雅”的方式。