2013-05-01 64 views
1

我有以下的域模型:請求DTO地圖領域模型

public class DaybookEnquiry : Entity 
{ 
    public DateTime EnquiryDate { get; set; } 
    [ForeignKey("EnquiryType")] 
    public int DaybookEnquiryTypeId { get; set; } 
    public string AccountNumber { get; set; } 
    [ForeignKey("User")] 
    public int UserId { get; set; } 

    #region Navigation Properties 

    public virtual User User { get; set; } 
    public virtual DaybookEnquiryType EnquiryType { get; set; } 
    public virtual ICollection<DaybookQuoteLine> QuoteLines { get; set; } 

    #endregion 
} 

這是一個名爲DomainModel項目內。 Entity只是我的域模型繼承的基類,它包含Id字段。

然後我的解決方案中有其他項目,名爲ServiceInterfaceServiceModelServiceInterface包含了我所有的服務我的應用程序和ServiceModel包含我的DTO的和路線等。我想跟隨這裏設立的準則:Physical Project Structure

EnquiriesService包含使用創建我的數據庫進行新的調查方法庫:

public void Post(CreateEnquiry request) 
{ 
    // Not sure what to do here.. 
    // _repository.Insert(request); 
} 

CreateEnquiry請求看起來像這樣:

[Api("POST a single Enquiry for Daybook.")] 
[Route("/enquiries", "POST")] 
public class CreateEnquiry : IReturnVoid { } 

正如你所看到的,CreateEnquiry請求對象是空。我是否需要爲其添加屬性以匹配我的域模型,然後使用AutoMapper或類似的東西將這些字段映射到我的域模型並將其傳遞到我的存儲庫?

在我的庫中的Insert方法看起來像這樣:

public virtual void Insert(T entity) 
{ 
    DbEntityEntry dbEntityEntry = DbContext.Entry(entity); 
    if (dbEntityEntry.State != EntityState.Detached) 
    { 
     dbEntityEntry.State = EntityState.Added; 
    } 
    else 
    { 
     DbSet.Add(entity); 
    } 

    DbContext.SaveChanges(); 
} 

回答

4

是。在這種情況下,您的服務請求CreateEnquiry需要具備您需要的所有屬性,以便完成您想要的任何操作!

我已經看到了兩個不同的模型創建VS更新:

叫,說
  • 使用一個請求對象,SetEnquiry,有一個可爲空的id字段。如果爲空並使用HTTP動詞POST,它會在內部創建一個新對象。當不爲空並且使用HTTP動詞時,它在內部更新一個對象。如果POST然後id字段需要爲空,您可以使用ServiceStack的AbstractValidator<T>的實現來添加邏輯,如;如果PATCH那麼id字段不能爲空。這將有助於確保您的數據始終如一。
  • 創建兩個請求對象 - 一個用於創建,一個用於更新。創建甚至沒有一個ID字段,並且更新有一個並且需要它。您可以使用上面使用的相同驗證技術,除了獨立應用於每個類別,因此如果此動詞執行此操作,則不需要的條件檢查;如果那個動詞做了那個

您如何映射到您的數據模型取決於您。你可以使用類似AutoMapper的東西,或者你可以使用ServiceStack的內置TranslateToPopulateWith方法。我個人採取了一箇中間立場:我創建了我自己的對象擴展方法,分別稱爲MapToMapFrom,分別稱爲TranslateToPopulateWith。我爲什麼要這樣做?因爲那時我在自己的命名空間內控制這些擴展,並且當我需要做特殊的映射時(比如列名不匹配,或者一個對象比另一個更復雜,或者我只是想忽略一個特定的列的對象)我只是用明確的類型重載MapToMapFrom,給它比通用方法更高的特異性。

所以回到你的問題具體。假設你使用內置的TranslateTo您的服務方法可能是這樣的:

public void Post(CreateEnquiry request) 
{ 
    _repository.Insert(request.TranslateTo<Enquiry>()); 
} 

一件事:我一般是在做一個創建和更新時,返回的對象本身。由於字段可以改變(例如自動計算的字段),我喜歡將對象返回給調用者。這是偏好,對我給你的答案沒有真正的影響。把它扔出去!