2014-05-22 216 views
1

我對如何正確處理Web API服務與業務邏輯的分離(特別是在使用服務堆棧時)存在疑問。我試圖改善上的代碼類似於以下內容:ServiceStack服務與業務邏輯分離

public class TenantService : Service 
{ 
    public object Post(TenantRequest req) 
    { 
     //create an instance of the struct to hold the data 
     TenantObject tenant = new tenant{ //set properties from the resquest}; 
     TenantRecord.InsertRecord(tenant) 
     // create a response after this // 
    } 
} 

然後在我的業務邏輯我有類似下面的內容:

public class TenantRecord 
{ 
    public static void InsertRecord(TenantObject tenant) 
    { 
     //Instantiate a new Tenant POCO 
     Tenant newRecord = new Tenant 
     { 
     Id = 1, Name = tenant.Name, CreatedDate = DateTime.Now, ...//And so on 
     }; 
     db.Insert(newRecord); 
    } 
    } 

這是造成嚴重的頭痛處理不斷重寫相同的代碼主要是映射代碼,但不斷創建結構來傳遞信息來回導致大量的數據映射。另外,在某些情況下,一個請求必須處理很多不同類型的信息。

業務邏輯應該引用API並傳遞請求本身,還是這種當前方法是最合適的方法?任何幫助將不勝感激。

+1

你可以嘗試使用[ServiceStack AutoMapper](https://github.com/ServiceStack/ServiceStack/wiki/Auto-mapping)(爲這種情況創建)。 – pasty

回答

4

ServiceStack provides AutoMapping extension methods使DTO對象直接映射到您的模型,因此您不必手動設置關係。

所以你Insert方法簡單地變爲:

public class TenantService : Service 
{ 
    public object Post(TenantRequest req) 
    { 
     var tenant = new Tenant { CreatedDate = DateTime.Now }.PopulateWith(req); 
     Db.Save(tenant); 
     return new { Id = tenant.Id }; 
    } 
} 

我會保持業務邏輯的操作方法,除非你有這種額外的抽象特定需要,如可重用性。 除了您的靜態InsertRecord方法將需要解決db的一個實例。添加不必要的複雜。

+1

編輯看起來不錯:) – mythz

+1

我確實需要進一步分離,但這個答案完全符合項目的需求。 – user3666537