4

ドメインモデルを使用したサービスがあり、クライアントにデータを公開したいと考えています。サービスには典型的なアーキテクチャがあります:データベース、ORM(EF)、ドメインモデルを備えたビジネスレイヤー。

WCF DataServicesを使用してデータをクライアントに公開したいのですが、ドメインモデルからクライアントにデータオブジェクトを送信できません。DTOを使用してクライアントと対話し、dto<=>データオブジェクトをマッピングします。

DataServicesには、この場合は問題ないように見えるリフレクションプロバイダーがあります(読み取り専用のシナリオを考えてみましょう)。ただし、リフレクションプロバイダーでは、IQueryable<dto>プロパティを公開する必要があります。そしてこれが問題です。だから私はそれを解決するために次の方法を見ます:

  1. すべてのドメインオブジェクトをロードし、それらすべてをdtosにマップして、結果のdtosを返します。多くのドメインオブジェクトが存在する場合、本当に悪いアプローチです。
  2. 「linq2dto」プロバイダーを作成し、動的に対応する「linq2EF」クエリを生成します。クエリの実体化の時点で、dbからデータオブジェクトを取得し、マッピングを実行します。良さそうに聞こえますが、私が見るように、それは複雑な作業です。

だからみんな、私は助けが必要です。新しい1つのlinqプロバイダーを作成(およびサポート)したくありません。私が使用できる「一般的なlinq2anyware」の実現がどこかにあるのでしょうか。

一方、私は実際にデータオブジェクトをクライアントに公開してDataServicesEFプロバイダーを使用することはできません。そのようなマッピングを実装する簡単な方法はありますか?

4

2 に答える 2

1

つまり、各 DTO を手動で記述します。

あなたが求めている答えではないかもしれませんが、これが私が提案するものです。実際の型を公開できない場合は、軽量のサテライト型を手動で記述します。たとえば、

class Foo
{
    //large domain type

    FooDTO ToDTO()
    {
        return new FooDTO(...)
    }
}

class FooDTO
{
    //lightweigh
}

汎用コンバーターの作成に役立つ LINQ プロバイダーは見たことがありませんが、私の経験が限られているためかもしれません。ジェネリック コンバーターの使用に対するもう 1 つの反論は、ドメイン タイプでは、軽量オブジェクトに何を含め、何を除外するかについて、非常に具体的な指示が必要になる場合があるということです。

あるいは、リフレクションを使用してすべてのパブリック プロパティを調べ、シリアル化されたオブジェクトを返すジェネリック クラスを作成しようとすることもできますが、ワイヤの反対側にあるオブジェクトの型をどのように知ることができますか (ドメインタイプ)?

于 2012-08-10T13:12:10.540 に答える
1

残念ながら、本当に DTO を使いたい場合は、クエリ ツリーを EF が使用できるものに変換する作業を行う必要があります。これは、対処しなければならない別の問題である、カスタム プロバイダーの領域に入る可能性が高いです。

特にクエリ ツリーの変換については、re-linqIQ toolkitなどを参照してください。

なぜ DTO が必要なのかという質問に対するコメントで、短い会話をしていただけますか? 他の人もその詳細を理解できれば、この質問はより役立つと思います。

于 2012-08-10T16:29:22.377 に答える