3

我是 ServiceStack 的新手,为了了解它的工作原理,我将为 Northwind 数据库开发一个 Web API(使用存储库模式)。

我检查了示例项目ServiceStack.Northwind,只有两个服务(客户和订单)。我想开发一个完整的 API(客户、订单、产品等)。像马特考恩所做的那样

基本上,所有服务对任何操作都会做同样的事情:

  • 接收请求。
  • 执行(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类型参数的情况下完成。

我将如何处理这个基类的开发?

非常感谢您提前。

4

1 回答 1

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)
    {
        // ...
    }
    // ...
}
于 2013-05-15T09:44:47.763 回答