首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServiceStack多服务web

ServiceStack多服务web
EN

Stack Overflow用户
提问于 2013-05-14 15:53:49
回答 1查看 327关注 0票数 3

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

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

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

  • 收到请求。
  • 执行(Repository.Get,Repository.Add,Repository.Update,Repository.Delete)。
  • 发回回复。

为此,我考虑创建一个基类来完成几乎所有的工作。首先,我开始做这样的事情:

代码语言:javascript
复制
public class BaseService<TRepository, TEntity, TDto> : Service
{
    ...
}

这个类的问题是,我不知道每个操作的请求和响应类型。所以我想把它们作为类型参数来传递:

代码语言:javascript
复制
public class BaseService<TRepository, TEntity, TDto, TRequest, TSingleResponse, TCollectionResponse> : Service
{
    ...
}

我不喜欢这样。我确信,不需要向类传递n个类型的参数,就可以做到这一点。

我如何看待这个基类的发展?

先谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-15 09:44:47

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

  • 使用TEntity作为对单个实体上的操作的请求/响应
  • 声明存储库接口IRepository<TEntity>以避免存储库类型参数

至于返回实体列表的操作(例如。FindCustomers,FindOrders) --每个操作可能都有唯一的搜索参数,无论如何,您都需要在派生类中实现它。

代码语言:javascript
复制
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)
    {
        // ...
    }
    // ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16547663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档