我对WCF完全不熟悉。
我想听听您对设置返回类型的服务方法的想法,这些方法会在主机服务器上添加新内容。
我需要让客户知道用户的电子邮件地址是否已经存在,否则继续。您是否更喜欢布尔值或异常(那么无意的异常呢?)
问题是,未来可能会添加许多验证标准,如果插入成功完成,我还需要知道新生成的用户ID。
由于
答案 0 :(得分:3)
您可以创建一个从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
返回AddMember()
,但使用类作为返回类型,您可以应用版本控制而无需更新所有客户端。如果你要添加一个新属性,比如你想要返回的boolean IsActivated
,你可以在AddMemberResult
类中为它创建一个属性,而不会破坏现有的客户端。
答案 1 :(得分:1)
我有例外。
正如你所说,你需要返回一个id,这是成功调用时服务的正确返回类型。
如果调用失败,您需要知道有关错误的信息。这就是例外情况。它们可以包含大量信息。
答案 2 :(得分:0)
不要抛出异常,因为它会导致通道进入 FAULT 状态,这意味着如果使用会话,则必须重新创建与服务器的新连接。这将导致低效的沟通。
我会创建一个继承自 IExtensibleDataObject
的数据合约例如,
[DataContract]
public class Result:IExtensibleDataObject
{
[DataMember]
public bool Created { get; set; }
[DataMember]
public Guid NewID { get; set; }
}
对于将来的扩展,您可以根据您拥有的方案(需要/不需要架构验证)将数据合同版本控制应用于您的类。有关详细信息here