3

私は ServiceStack の初心者であり、そのしくみを学ぶために、Northwind データベース用の Web API を開発します (リポジトリ パターンを使用)。

サンプル プロジェクトServiceStack.Northwindを確認しましたが、2 つのサービス (Customers と Orders) しかありません。完全な 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 に答える