ServiceStack多服务Web API

3

我是一个ServiceStack的新手,为了学习其工作原理,我将开发一个使用存储库模式的北风数据库Web API。

我查看了示例项目ServiceStack.Northwind,但只有两个服务(客户和订单)。我想开发一个完整的API(客户、订单、产品等),就像Matt Cowan所做的

基本上,所有服务都会执行相同的操作:

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

我应该如何开发这个基础类呢?

非常感谢您提前的帮助。

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)
    {
        // ...
    }
    // ...
}

在您的示例代码中,您可以使用如下的公共属性:public IRepository<TEntity> Repository { get; set; },然后让 IoC 容器解析依赖项。好的方法,非常感谢。 - Merrin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接