6

たとえば、IISでホストされている2つのサービスがあります。

[ServiceContract]
public interface IDeviceService
{
    [OperationContract]
    DeviceCollection GetAllDevices(Customer customer);

}

[ServiceContract]
public interface IUserService
{
    [OperationContract]
    User Authenticate(string username, string password);

}

UserServiceのAuthenticate操作から返されるUserオブジェクトと、DeviceServiceのGetAllDevices操作から返されるDeviceCollectionの両方に、Customerの子オブジェクト定義があります。顧客はビジネスオブジェクトであり、ユーザーおよびデバイスオブジェクトと同じアセンブリにあります。

私の問題はクライアントにあります-デバイス操作を呼び出すとき

userProxy.GetAllDevices(user.Customer);

コンパイラは次のメッセージで文句を言います:

引数1-UserService.CustomerからDeviceService.Customerに変換できません

両方のサービスに正常に接続できます。問題はCustomerのオブジェクト定義です。彼らが彼ら自身のサービスで自然に生きているように見えるので、私は実際にオペレーションを同じサービスに入れたくありません。私が求めているのは、他のプログラマーがそのような問題にどのように対処するかということだと思います。

乾杯、スチュアート

4

4 に答える 4

3

複数のサービス間でデータコントラクトを共有する場合は、問題のデータコントラクトを独自のアセンブリにコンパイルしてから、そのアセンブリをクライアントに配布する必要があります。

タイプは同じように見えますが、実際には2つの別個のタイプであるため、表示されているエラーが表示されます。(個別の共有アセンブリ以外の)他の唯一の選択肢は、2つのサービスを1つに結合して、データコントラクトを共有できるようにすることです。

于 2009-06-23T15:34:32.200 に答える
2

1 つのオプションは、クライアントでAutoMapperを使用して、あるタイプから別のタイプにシームレスに変換することです。それらは同じプロパティを持っているので、マッピングは簡単です。

于 2009-07-21T19:43:18.900 に答える
0

それはセマンティックの問題です。1 つの UserService.Customer と DeviceService.Customer を意味的に等しいものとして定義する場合は、そのデータ コントラクトを別のアセンブリに物理的にリファクタリングする必要があります。または、UserService.Customer と DeviceService.Customer を意味的に異なるものとして定義する場合は、それらを別々の型として保持し、一方から他方に変換するユーティリティ関数を記述します。

于 2009-06-25T11:02:28.850 に答える