0

I have the following (simplified) scenario.

There is a WCF service (MyService), which exposes some entity MyEntityDTO. On the client side, I have created an interface IMyServiceClient which is being passed to my client-side components, so they can request MyEntityDTOs from any underlying implementation. And also now I can run client-side unit tests using some MockedMyServiceClient : IMyServiceClient. Seems good so far.

Now I have created an actual MyRealWCFServiceClient : IMyServiceClient, which essentially just wraps around the WCF service reference created by Visual Studio.

One issue is that WCF service reference returns a completely another kind of MyEntityDTO, so I have to map it from the service reference entity type to MyEntityDTO type which is returned from IMyServiceClient. I can use AutoMapper for this.

But here comes the biggest issue. Let's say, I want to reuse my MyRealWCFServiceClient in some other applications in my project. If each of these applications will have it's own WCF service reference with it's own DTO types, I'll have to somehow pass all the DTO types of the current service reference and configure AutoMapper with some tricky Reflection to inject my Generic types into it. What a mess...

But I could collect my common WCF references with their wrapping MyRealWCFServiceClients in some common library, so all MyRealWCFServiceClients use only those known common WCF references.

I wonder, is it a good practice to create a common library for service references? Is there a better solution for this?

4

1 に答える 1

1

共通のクライアントを作成する場合は、サービス側から出荷される配布可能なアセンブリとして作成します。つまり、共通のクライアントを作成してから配布します。クライアント側からプロキシを構築しないでください。

(DTO 用に) 別のプロキシが生成されるという事実については、DTO 実装を含むコントラクト アセンブリを参照できる場合。次に、VS を使用してプロキシを構築します。プロキシ ジェネレータは、参照される元の DataContract を使用するのに十分スマートです (新しいプロキシ クラスを生成しません)。

だから、あなたには2つの選択肢があると思います。1 つは、共通のクライアントであるプロジェクトを作成し、それを配布します。または 2 つ目は、クライアント側を生成する前にコントラクト アセンブリ ディレクトリを参照することです。

お役に立てれば。

于 2012-06-06T10:39:05.290 に答える