2013-05-14 74 views
3

我與ServiceStack一個新手,並瞭解它是如何工作的,我會制定Northwind數據庫中的網絡API(使用存儲庫模式)。ServiceStack多個Web服務的API

我檢查樣本項目ServiceStack.Northwind和只有兩個服務(客戶和訂單)。我想開發一個完整的API(客戶,訂單,產品等)。類似Matt Cowan has done

基本上,所有的服務將任何操作做同樣的:

  • 接收請求。
  • Execute(Repository.Get,Repository.Add,Repository.Update,Repository.Delete)。
  • 發送回覆。

爲此,我考慮過讓基礎課程做幾乎所有的工作。首先我從類似的東西開始:

public class BaseService<TRepository, TEntity, TDto> : Service 
{ 
    ... 
} 

這個類的問題是我不知道每個操作的請求和響應類型。所以我想我會通過它們作爲類型參數:

public class BaseService<TRepository, TEntity, TDto, TRequest, TSingleResponse, TCollectionResponse> : Service 
{ 
    ... 
} 

我不喜歡這樣。我相信它可以在不通過n類型參數的情況下完成。

我將如何處理這個基類的發展?

非常感謝您提前。

回答

2

您可以通過以下建議減少的類型參數的個數:

  • 使用TEntity爲您的請求/運營上的單一實體響應
  • 聲明倉庫接口IRepository<TEntity>避免倉庫類型參數

至於返回實體列表(例如FindCustomers,FindOrders)的操作 - 每個操作可能都有唯一的搜索參數,您需要無論如何要在派生類中實現它。

public class BaseEntity 
{ 
    public int Id { get; set; } 
    // ... 
} 

public interface IRepostory<TEntity> where TEntity : BaseEntity 
{ 
    IList<TEntity> GetAll(); 

    TEntity Get(int id); 

    void Save(TEntity entity); 
    // ... 
} 

public class BaseService<TEntity, TCollectionRequest> : Service 
    where TEntity : BaseEntity 
{ 
    public IRepository<TEntity> Repository { get; set; } 

    public virtual object Get(TEntity request) 
    { 
     return Repository.Get(request.Id); 
    } 

    public virtual object Get(TCollectionRequest request) 
    { 
     return Repository.GetAll(); 
    } 

    public virtual object Post(TEntity request) 
    { 
     Repository.Save(request); 
     return request; 
    } 

    public virtual object Put(TEntity request) 
    { 
     // ... 
    } 
    // ... 
} 
+0

好辦法,非常感謝你。 在你的示例代碼中,你可以使用像public'IRepository Repository {get;組; }並讓IoC容器解析依賴關係。 – Merrin 2013-05-15 11:17:05

+0

是的,沒錯,我編輯了答案。 – AlexD 2013-05-15 13:08:59