2

私はWCFにまったく慣れていません。

ホスト サーバーに新しいコンテンツを追加するサービス メソッドの戻り型の設定について、ご意見をお聞かせください。

ユーザーの電子メール アドレスが既に存在するかどうかをクライアントに知らせる必要があります。それ以外の場合は続行します。ブール値と例外のどちらを使用しますか (意図しない例外はどうでしょう)。

問題は、多数の検証基準が将来追加される可能性があり、挿入が正常に完了した場合、新しく生成されたユーザー ID も知る必要があるということです。

ありがとう

4

3 に答える 3

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既存のクライアントを壊すことなく、クラス内にそのプロパティを作成するだけです。

于 2012-06-18T13:00:09.413 に答える
1

私は例外を持って行きます。

あなたが言うように、あなたはIDを返す必要があります、それでそれは首尾よく呼び出されたときのサービスからの適切なリターンタイプです。

呼び出されなかった場合は、何がうまくいかなかったかについての情報を知る必要があります。これが例外です。それらには多くの情報が含まれている可能性があります。

于 2012-06-18T12:58:19.720 に答える
0

チャネルがFAULT状態になるため、例外をスローしないでください。つまり、セッションを使用する場合は、サーバーへの新しい接続を再作成する必要があります。これは非効率なコミュニケーションにつながります。

IExtensibleDataObjectから継承するデータ コントラクトを作成します。

例えば、

[DataContract]
    public  class Result:IExtensibleDataObject
    {
        [DataMember]
        public bool Created { get; set; }

        [DataMember]
        public Guid NewID { get; set; }

    }

将来の拡張のために、シナリオに応じてクラスにデータ コントラクトのバージョン管理を適用できます (スキーマの検証が必要/不要)。詳細はこちら

于 2012-06-18T13:39:05.357 に答える