我是 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/