WCF如何避免定义许多操作契约

时间:2012-09-13 12:28:37

标签: c# .net wcf

在我的界面中,我将拥有许多功能。所有这些都将绑定为OperationContract。

有没有办法避免在这些函数中的每一个上键入[OperationContract]?

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

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

3 个答案:

答案 0 :(得分: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
}

第二件事 - 将这些合同分解成小合同(记住单一责任原则)。你不应该签订负责全世界的合同。

答案 1 :(得分:1)

没有简单的方法可以做到这一点。如果您希望服务的客户端可以使用[OperationContract]属性,则必须使用[OperationContract]属性修饰所有方法。

答案 2 :(得分:1)

要获得客户端可见性,必须使用[OperationContract]修饰所有方法。看起来你正在构建一个讨厌的界面(GetStudentThis(id),GetStudentThat(id)等) - 非常像存储过程。尝试通过减少执行更多工作的方法来使界面变得粗糙。

例如,将“request”对象传递给所有方法。此请求将封装执行方法所需的参数。像这样:GetStudent(StudentRequestObject / Message request)。现在,您的方法实现可以检查单个参数的内容,相应地执行操作,并将“响应”对象返回给封装有效负载的客户端。

结果将是更少的方法([OperationContract]),更容易维护和更少的代码。