1

私のインターフェースには、多くの機能があります。これらはすべて OperationContract としてバインドされます。

これらの関数のすべてに [OperationContract] を入力しないようにする方法はありますか?

[ServiceContract]
public interface IStudentService
{
    [OperationContract]
    String GetStudentFullName (int studentId);

    [OperationContract]
    StudentInformation GetStudentInfo (int studentId);
    ... about 20 more
}
4

3 に答える 3

5

多数 (20 以上) の操作契約を含むサービス契約は避ける必要があります。

最初にできることは、サービスが構築されているパターンを変更することです。操作の結果として単一のデータ値を投稿して返す代わりに、DTO (または、該当する場合は STE) を使用して、オブジェクト グラフを操作します。

[OperationContract]
StudentDTO GetStudent(int studentId);
[OperationContract]
StudentDTO UpdateStudent(CreateStudentDTO student);
[OperationContract]
StudentDTO UpdateStudent(UpdateStudentDTO student);

[DataContract]
public class StudentDTO
{
  public int Id { get; set; }
  public string Name { get; set; }
  public StudentInformationDTO StudentInformation { get; set; }

  // other student's data here
}

2番目に、そのような契約を小さなものに分割します(単一責任の原則を思い出してください)。世界中に責任がある契約をするべきではありません。

于 2012-09-13T12:46:02.957 に答える
1

クライアントの可視性のために、すべてのメソッドを [OperationContract] で装飾する必要があります。おしゃべりなインターフェイス (GetStudentThis(id)、GetStudentThat(id) など) を構築しているように見えます - ストアド プロシージャに非常によく似ています。より多くの作業を行うメソッドを少なくして、インターフェースを分厚くするようにしてください。

たとえば、「リクエスト」オブジェクトをすべてのメソッドに渡します。このリクエストは、メソッドの実行に必要なパラメーターをカプセル化します。このようなもの: GetStudent(StudentRequestObject/Message request)。これで、メソッドの実装で 1 つのパラメーターの内容を調べて、それに応じて動作し、ペイロードをカプセル化して「応答」オブジェクトをクライアントに返すことができます。

その結果、メソッド ([OperationContract]) が少なくなり、メンテナンスが容易になり、コードが少なくなります。

于 2012-09-13T13:15:22.327 に答える
1

これを行う簡単な方法はありません。サービスのクライアントがメソッドを利用できるようにする場合は、すべてのメソッドを [OperationContract] 属性で装飾する必要があります。

于 2012-09-13T12:41:22.533 に答える