我对 WCF 完全陌生。
我想听听您对设置在主机服务器上添加新内容的服务方法的返回类型的想法。
我需要让客户知道用户电子邮件地址是否已经存在,否则继续。您更喜欢布尔值还是异常(那么意外异常呢)?
问题是,将来可能会添加许多验证标准,如果插入成功完成,我还需要知道新生成的用户 ID。
谢谢
我对 WCF 完全陌生。
我想听听您对设置在主机服务器上添加新内容的服务方法的返回类型的想法。
我需要让客户知道用户电子邮件地址是否已经存在,否则继续。您更喜欢布尔值还是异常(那么意外异常呢)?
问题是,将来可能会添加许多验证标准,如果插入成功完成,我还需要知道新生成的用户 ID。
谢谢
您可以创建一个从CreateSomething()
方法返回的结果类,并在出现问题时抛出一个FaultException
:
public AddMemberResult AddMember(Member member)
{
// check all input, create the member
if (allGood)
{
return new AddMemberResult { UserID = createdMember.ID };
}
else
{
throw new FaultException<AddMemberError>(new AddMemberError(errors));
}
}
class AddMemberResult
{
public int UserID { get; set; }
}
class AddMemberError
{
public AddMemberError(List<Error> errors)
{
Errors = errors;
}
List<Error> Errors { get; set; }
}
class Error
{
public int Code { get; set; }
public string Description { get; set; }
}
当然,您可以简单地返回int
from AddMember()
,但使用类作为返回类型,您可以应用版本控制,而无需更新所有客户端。如果您要添加一个新属性,说明boolean IsActivated
您还想返回哪个属性,您可以在AddMemberResult
类中简单地为该属性创建一个属性,而不会破坏现有客户端。
我会例外。
正如您所说,您需要返回一个 id,因此这是成功调用时服务的正确返回类型。
如果呼叫失败,您将需要了解有关问题的信息。这就是例外。它们可以包含大量信息。
不要抛出异常,因为它会导致通道陷入FAULT状态,这意味着如果您使用会话,您将不得不重新创建与服务器的新连接。这会导致沟通效率低下。
我将创建一个继承自IExtensibleDataObject的数据合约
例如,
[DataContract]
public class Result:IExtensibleDataObject
{
[DataMember]
public bool Created { get; set; }
[DataMember]
public Guid NewID { get; set; }
}
对于未来的扩展,您可以根据您拥有的场景(需要/不需要架构验证)将数据合同版本控制应用于您的类。更多信息可在此处获得