5

edmx ファイルの別のプロジェクトにすべてのエンティティがあり、WCF サービスを使用してそれらをクライアント アプリケーションに公開しています。

つまり、edmx ファイルを含むプロジェクトへの直接リンクをクライアント アプリに提供する必要はありません。データベースを照会するオブジェクトを継続するため、これは悪いことです。

ただし、クライアント アプリからアクセスできるのは、WCF サービスが使用するエンティティのみです。たとえば、サービスに次のコードがあるためです。

public MyClass GetMyClass()
{
     return new MyClass();
}

.. 次のようなクライアント アプリで Access MyClass を使用できます。

myServiceInstance.MyClass cls = new  myServiceInstance.MyClass()

クライアント アプリで使用したい edmx ファイルに MyClass2 というエンティティがある場合はどうでしょう。クライアントに edmx ファイル プロジェクトへの直接リンクを提供したり、サービス レイヤーで MyClass2 を返す役に立たないメソッドを作成したりせずにインスタンス化する方法

他の人は何をしていますか?

どうもありがとう

4

3 に答える 3

3

さまざまな内部WCFサービスのデータコントラクトとして機能するドメイン転送オブジェクトクラスを使用して、別のプロジェクトを作成しました。次に、契約プロジェクトをそれらの内部サービスと共有しました。1つのデータサービスがありました。これらのメソッドは、保存/取得の前後に、これらのドメインオブジェクトをエンティティオブジェクトとの間で変換します。一方、外部サービスは、XSDファイルとWSDLファイルから生成され、共有ドメイン転送モデルとの間で変換される標準プロキシを利用していました。

残念ながら、オブジェクトコンテキストは(まだ)WCFを介して移植できないため、これを行う必要がありました。

あなたの状況に関するいくつかの考慮事項:

  1. クライアントアプリがシステムの外部にある場合、EDMXまたはそのクラスについて何も知らないはずです。それはあなたのWSDLとXSDについてのみ知っているべきです。
  2. クライアントアプリが内部にある場合は、まだ適切にサポートされていないため、EFv1でエンティティクラスを共有しようとしても意味がありません。クラス/オブジェクトだけでなく、コンテキストも転送する必要があります。これにより、変更の追跡が維持されます。現在、WCFを介して直接転送することはできません。
于 2008-10-21T07:49:15.240 に答える
2

WCF サービスがそれを使用しない場合、何のために使用しますか? WCF サービス (それ自体) は純粋にデータ トランスポート用です。メタデータの "mex" アプローチはコードを共有しないため、MyClass2 は無効になります。必要に応じて、クライアントでアセンブリ共有を使用できますが、この場合はお勧めしませんクライアントのEFオブジェクトは混乱しています...(さらに、Silverlight、Client Profile、Compact Frameworkなどの軽量フレームワークでは機能しません)

別のオプションはADO.NET Data Servicesです。これは WCF で機能しますが、通常の WCF アプローチよりも LINQ に適した API を提供します。また、モデルが公開するすべてのドメイン オブジェクトをクライアント データ コンテキストで使用できるようにする必要があります。

于 2008-10-21T06:46:16.397 に答える
1

「適切な」方法でそれを行いたい場合は、ビジネス エンティティまたはデータ オブジェクトをメッセージとして再利用しようとするのではなく、回線を通過するメッセージ用の特別なクラスを作成する必要があります。これの価値は、消費者に公開したコントラクトが変更されることを心配することなく、ビジネス エンティティとデータ オブジェクトを自由に変更できることです。サービスへのすべての変更は、データやビジネス ロジックへの変更とは無関係に発生するため、少し慎重になります。

これを処理するもう 1 つの方法は、サーバー プロジェクトへの参照を追加する代わりに、svcutil (または「サービス参照の追加...」ですが、svcutil は複数のサービス エンドポイントに対してより適切に機能します) を使用して、クライアントが使用するすべてのクラスを生成することです。そうすれば、クライアントが目にするクラスは、サービスによって公開されるクラスだけになります。

于 2008-10-21T12:46:25.733 に答える