2013-05-14 71 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