添加新实体时WCF方法返回类型

时间:2012-06-18 12:54:17

标签: .net wcf validation

我对WCF完全不熟悉。

我想听听您对设置返回类型的服务方法的想法,这些方法会在主机服务器上添加新内容。

我需要让客户知道用户的电子邮件地址是否已经存在,否则继续。您是否更喜欢布尔值或异常(那么无意的异常呢?)

问题是,未来可能会添加许多验证标准,如果插入成功完成,我还需要知道新生成的用户ID。

由于

3 个答案:

答案 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