c# - ServiceStack 多服务 Web API

标签 c# servicestack

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

我已经检查了示例项目 ServiceStack.Northwind并且只有两种服务(客户和订单)。我想开发一个完整的 API(客户、订单、产品等)。类似于 Matt Cowan has done .

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

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

我将如何开发这个基类?

非常感谢您。

最佳答案

您可以使用以下建议来减少类型参数的数量:

  • 使用TEntity作为您对单个实体操作的请求/响应
  • 声明存储库接口(interface)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)
    {
        // ...
    }
    // ...
}

关于c# - ServiceStack 多服务 Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16547663/

相关文章:

redis - 根据属性值检索 servicestack redis session 对象的选择

c# - 如何更改 ServiceStack 中的默认 ContentType?

c# - ServiceStack.Redis : PooledRedisClientManager creating way too many connections

c# - 如何检查请求 URI 是否有任何参数

c# - JSon反序列化哈希

c# - WPF DataGrid - 将数据项的属性绑定(bind)为 CommandParameter

.net - 对于使用服务堆栈创建的服务,如何使用 SSL 保护我的服务?

c# - 如何在unity inspector中制作折线图

c# - 如何避免在 C# 类之前编写命名空间

c# - 如何使用 ServiceStack JsonSerializer 序列化 ExpandoObject?