1

UI-Service-Business-Data Access-Database という階層化された APS.Net アプリケーションがあります。

たとえば、ユーザーを保存または更新するときは、UserDto オブジェクトを作成し、UI にプロパティを入力してから、そのオブジェクトをレイヤーを下ってデータ アクセサーの Save メソッドに渡します。

保存すると、更新または挿入されたユーザーの ID が返されます。

protected void btnSave_Click(object sender, EventArgs e)
        {
            var o = new UserDto
                {
                    DisplayName = txtName.Text,
                    Email = txtEmail.Text,
                    Username = txtUsername.Text,
                    Password = txtPassword.Text,
                    TimeZoneId = ddZones.SelectedValue,
                    Id = Session["SelectedUserId"] == null ? 0 : int.Parse(Session["SelectedUserId"].ToString())
                };

            int id = new UserService(Common.CurrentUserId()).SaveUser(o);

            Response.Redirect("users.aspx");

        }

これはすべて機能していますが、検証レイヤーをビジネスレイヤーに追加しています。これにより、いくつかのビジネス ルールに対してオブジェクトが検証され、問題がなければ保存します。それ以外の場合は、何かを返し、UI で問題を示すために使用します。

したがって、現時点での私のバリデーター、basic..は、保存する前にユーザーオブジェクトを受け入れ、検証を行い、trueまたはfalseを返すメソッドを持っています...次のようになります:

public static bool SaveUser(UserDto user)
        {
            if (user == null)
            {
                return false;
            }

            if(user.Username.Length < 4 || user.Username.Length > 15)
                return false;

            if (user.Password.Length < 4 || user.Password.Length > 15)
            {
                return false;
            }

            try
            {
                var m = new MailAddress(user.Email);
                return true;
            }
            catch (FormatException)
            {
                return false;
            }

        }

注:このメソッドは保存を行いません...そのため、名前を変更する可能性があります(ただし、Validationクラスにあります)。このオブジェクトを保存できますか。

それで、いくつかの基本的な検証。ただし、私の戻り値の型は bool です。私はそれが何かのようなものを返したいと思っていList<String> ValidationErrorsます。

しかし、私の UI からの save メソッドは int を想定しており、すべてがうまく保存されれば、int が欲しいだけです。エラーが発生したときにどのように処理すればよいですか? List<> を返す必要がありますか?

私がこれを投稿したとき、ちょうど私に浮かんだアイデア: たぶん、戻り値の型であり、保存されたアイテムの「Id」とリストを持つ SaveUserDto オブジェクトを作成できますか?

そこで、UserDto を送信し、e SaveUserDto? で返信します。または、より一般的には、UserDto を送信し、ResponseDto で応答します。これには、id (アイテムが保存されている場合) とエラーのリスト、および ErrorList.Count > 1 の場合に true になる bool プロパティが含まれます。 ?

4

3 に答える 3

1

私の観点からは、プレゼンテーションを除くすべてのレイヤーで例外をキャッチしないようにする必要があります。このようにして、エラーがレイヤーを介して泡立ちます。一般的なasp.netバリデーターとサマリーを使用して問題に対処し、適切に表示するのは、プレゼンテーションの最終レイヤーのみです。このアプローチでは、エラー処理の作業をプレゼンテーション層に任せ、他の層はクリーンなままであり、すべての例外は変更なしで最上位に到達します。

内部レイヤーでエラー処理を行う必要がある場合は、カスタム例外を追加するだけなので、NullReferenceException を取得する代わりに、それをキャッチして独自の WebUserNotFoundException をスローできます。この場合、すべての例外を含む新しいプロジェクトを追加し、すべてのレイヤーで参照します。例外を作成するには、例外クラスから継承するベース カスタム例外を作成し、ベース クラスを継承する各カスタム例外を作成します。

SOA を作成する必要がある場合にのみ、このアプローチを変更します。その場合、要求された情報とサービス呼び出し時に発生したことの両方を取得できるベース リターン オブジェクトを作成します。

于 2013-08-25T06:56:12.383 に答える
1

このパターンでは、検証エラーが発生した場合にスローできるカスタム検証例外を作成することが理にかなっている場合があります。呼び出し元側の try キャッチはList<string>、例外自体のプロパティを検索し、UI にエラーを表示できます。

または、代わりに成功/エラー コレクションを含むオブジェクトを返すこともできます。

于 2013-08-25T05:34:18.630 に答える