0

新しいASP.NETMVC3アプリケーションを作成する場合、既定のプロジェクトにはModelsフォルダーがあります。このModelsフォルダには、AccountModels- RegisterModelLoginModelなどが含まれます。

DAL用に別のプロジェクトがあります-それにはとが含まれてrepositoryserviceます。

今、私は私の中にメソッドを持っていますservice

TblUser Register(RegisterModel model);

これを機能させるには、データプロジェクトでWebプロジェクトを参照する必要があります。

Modelsこれは適切ですか、それともデータプロジェクトにフォルダを含める必要がありますか?

4

1 に答える 1

1

最初のオプションは適切ではありません。それは循環依存と呼ばれるものであり、それは悪いことです。

2番目のオプションの方が優れていますが、それでも優れていません。モデルクラスには、間違いなく、UIにのみ適用できるフィールドとメソッドがあります。これらは、データオブジェクトがWeb層に属している以上、データレイヤーに属していません。これは結合の例であり、関心の分離が不十分であることとしても知られていますが、これも悪いことです。

最良のオプションは、両方の層で必要なデータを別個のクラスのセット(dto(データ転送オブジェクト)またはpoco(プレーンな古いクラスオブジェクト)と呼ばれることもあります)に分離することです。これらのクラスは、ニーズに応じて、データプロジェクトまたはプロジェクト全体に常駐できます。サービスがWCFサービスに存在する場合、これらのクラスは通常DataContractsになります。次に、MVCプロジェクト内に、現在のモデルが必要ですが、独自のデータを保持するのではなく、POCOへの参照が含まれている必要があります。したがって、特定のケースでは、データプロジェクトにRegistrationInfoクラス(またはそれを呼び出したいもの)を作成し、RegistrationInfoタイプのフィールドをモデルに追加して、RegistrationModel全体ではなくサービスに渡します。

編集:例を追加

namespace MyProject.Data.Objects {
    public class RegistrationInfo {

        [Required]
        public string Username { get; set; }

        [Required]
        public string Password { get; set; }

        [Required]
        public string Email { get; set; }

    }
}

namespace MyProject.Data {
    public class MyService {
        public TblUser Register(RegistrationInfo info) {
            // .. save to the database ..
        }
    }
}

namespace MyProject.UI.Models {
    class RegistrationModel {
        public RegistrationInfo Info { get; set; }

        /* Fields which the ui needs but the database does not */
        public bool ConfirmPassword { get; set; }
        public bool AllowFreeEmailAddresses { get; set; }

        public void Save() {
            new MyProject.Data.MyService().Register(this.Info);
        }

        public RegistrationModel() {
            this.Info = new RegistrationInfo();
        }
    }
}
于 2012-10-25T03:14:55.083 に答える