在我的界面中,我将拥有许多功能。所有这些都将绑定为OperationContract。
有没有办法避免在这些函数中的每一个上键入[OperationContract]?
[ServiceContract]
public interface IStudentService
{
[OperationContract]
String GetStudentFullName (int studentId);
[OperationContract]
StudentInformation GetStudentInfo (int studentId);
... about 20 more
}
答案 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]),更容易维护和更少的代码。