5

最近、私はプロジェクトを開発するように頼まれました。アーキテクチャは次のようになります。

  • 1層:Nhibernate上のDataAccessベース
  • 2層:WCFサービスと一部のコアクラスに基づくビジネスレイヤー
  • 3層:Silverlightに基づくビュー

DTOオブジェクトを使用して、第2層と第3層の間でデータを渡します。

プロジェクトには巨大なドメインモデルがあり、多くのビジネスエンティティが標準およびカスタムのCRUD操作をサポートする必要があることに気づきました。最初の層では、一般的なNHibernateリポジトリ+仕様によって解決されます。

ただし、第2層(1つのWCFサービス)は、第3層にDTOのカスタムおよび標準のCRUDインターフェイスを提供する一連のメソッドのように見えます。

たとえば、モデルは次のようになります。

class Product {}
class Category {}

DTO:

class ProductDTO {}
class CategoryDTO {}

「問題のある」WCFサービス:

public class DataService
{
  public List<CategoryDTO> GetAllCategories()
  {
  }

  public List<ProductDTO> GetAllProducts()
  {
  }
}

考えられる解決策:

public class ProductDataService
{
  public List<ProductDTO> GetAllProducts()
  {
  }
}

 public class CategoryDataService
{
  public List<CategoryDTO> GetAllCategories()
  {
  }
}

質問:

  1. 上記の解決策の良い代替案はありますか?
  2. この状況でWCFサービスで使用できる「一般的な」方法はありますか?
4

2 に答える 2

3

「参照」データ(カテゴリ、製品など)のCRUDについて純粋に話していると仮定すると、GetAllXXXメソッドが多数ある1つのサービス、または複数のサービスがあり、最終的にはベースのサービスから継承する必要があります。転送するDTOがたくさんあるかのように、実際には問題ではありません。多くのGetXXXメソッドを取得します。

これらの2つのポイントに注意してください:

  • wcfサービスのメソッド数が多いほど、「ウォームアップ」時間が長くなります(この問題は、約100〜200のメソッドで発生します(1)
  • wcfは、ジェネリックパラメータが定義されていないと「ジェネリック」メソッドを公開できません

例えば ​​:

public class DataService<TIn>
{
    protected List<TOut> GetAll<TOut>()
    {
         // handle generic loading and transformation here
    }
}

public class CategoryService : DataService<Category>
{
    public List<CategoryDTO> GetAllCategories()
    {
        return GetAll<CategoryDTO>();
    }
}

また

public class DataService
{
    protected List<TOut> GetAll<TIn, TOut>()
    {
         // handle generic loading and transformation here
    }

    public List<CategoryDTO> GetAllCategories()
    {
        return GetAll<Category, CategoryDTO>();
    }
}

次に、ジェネリックメソッド内で、たとえばAutomapperを使用してCategoryからCategoryDtoにマップできます。

最後に、より多くのユーザー/ビジネス指向のサービスについては、各「ビュー」に表示するデータに固有のDTOが必要です。

(1)はい、それはOOPの観点から非常に重要です。しかし、大規模なデータベースからのコード生成でこれらの問題に到達する傾向があります:)

于 2013-01-23T16:10:19.523 に答える
3

上記の解決策の良い代替案はありますか?

はい、RESTfullサービスを使用できます。また、ファットインターフェイス(mathieuソリューション)の使用はお勧めしません。ファットインターフェイスは、保守やリファクタリングが難しく、かさばって重いです。RESTを使用する場合は、次のようなAPIを使用できます(WCFで使用できるのと同様のインターフェイス)。

この状況でWCFサービスで使用できる「一般的な」方法はありますか?

はい、サーバーでジェネリックを使用できますが、クライアントにはこれは具体的なタイプとして表示されます。例については、この投稿を参照してください。

于 2013-01-23T16:35:06.590 に答える