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
}

第二件事 - 将此类合同分成小合同(记住单一责任原则)。你不应该做对全世界负责的合同。

于 2012-09-13T12:46:02.957 回答
1

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

于 2012-09-13T12:41:22.533 回答
1

对于客户端可见性,所有方法都必须用 [OperationContract] 修饰。看起来您正在构建一个健谈的界面(GetStudentThis(id)、GetStudentThat(id) 等)——非常类似于存储过程。尝试通过使用更少的方法来完成更多的工作,从而使您的界面变得厚实。

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

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

于 2012-09-13T13:15:22.327 回答