给定一个运营合同,例如:
[OperationContract]
void Operation(string param1, string param2, int param3);
这可以重新设计为:
[MessageContract]
public class OperationRequest
{
[MessageBodyMember]
public string Param1 { get; set; }
[MessageBodyMember]
public string Param2 { get; set; }
[MessageBodyMember]
public int Param3 { get; set; }
}
[MessageContract]
public class OperationResponse
{
}
[OperationContract]
OperationResponse Operation(OperationRequest request);
我喜欢 MessageContract 的一件事是我可以更明确地控制 SOAP 消息的格式。
同样,我可以编写几乎相同的代码,但使用 DataContract:
[DataContract]
public class OperationRequest
{
[DataMember]
public string Param1 { get; set; }
[DataMember]
public string Param2 { get; set; }
[DataMember]
public int Param3 { get; set; }
}
[DataContract]
public class OperationResponse
{
}
[OperationContract]
OperationResponse Operation(OperationRequest request);
我喜欢 DataContract 的一件事是我可以定义 IsRequired、Order 和 Name。
今天,我预计唯一的消费者将是 WCF 客户端。但是,我想先设计契约,并尽可能地坚持 SOA 实践。我不想让 WCF 规定我的 SOAP、WSDL 和 XSD,而是希望 XML 定义 WCF 层,但使用 WCF 生成它,以免向 WCF 添加任何自定义消息处理。我想遵循最常见的 SOA XML 约定,我认为这些约定可能所有标签都以小写开头——对吗?我想尽可能地容忍版本。
总是像这样创建请求和响应消息是否明智?三种格式中的哪一种促进了最佳 SOA 实践?我是否应该更进一步并定义一个 DataContract 和一个 MessageContract,而 MessageContract 只包含 DataContract?或者,如果我真正公开一种新类型(即不将消息类型创建为容器),我是否应该只使用 DataContracts?
我知道一组加载的问题,但我正试图深入其中,我不确定将问题分开是否能提供足够的上下文来获得我正在寻找的答案。