2011-03-04 79 views
0

時,假設你有初始化它的默認值業務邏輯域實體。例如。初始化的DTO使用RIA服務

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操作中UPDATE方法)。

是這種情況下(即服務器端生成的DTO的)在RIA服務實現的?

回答

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

我知道,這看起來有點瑣碎,但我不知道更「優雅」的方式。

+0

謝謝,是的,這將會完成這項工作。看起來RIA服務v1.0對於「真實世界」應用程序還不完全準備好。我們現在決定在我們的Silverlight LOB應用程序中不使用RIA服務,因此,還有['多對多'限制](http://stackoverflow.com/questions/1768489/many-to-many-關係型淨RIA服務)。 RIA services v1.0聞起來像實體框架v1.0 - 很有前途,但更好地等待v2.0。 –