2

私はちょうど「ああ、ハァッ!」に行く寸前です。ドメイン駆動設計のコーディングに関しては。問題は、エンティティ、値オブジェクト、およびいくつかの追加フィールドを含むMVCActionMethodパラメータークラスをどこでどのように定義するかです。 エンティティクラスと値オブジェクトクラスは、私のリポジトリで定義されています。

私は:

  1. 他のクラスを実装するリポジトリにカスタムクラスを作成し(単一のクラスですべてのプロパティを取得するため)、追加のフィールドにさらにいくつかのプロパティを追加しますか?
  2. リポジトリにエンティティ/値オブジェクトのpocoクラスを作成し、コントローラークラスでこれらのオブジェクトを参照する複合クラスを作成してから、これをActionMethodパラメータータイプとして使用しますか?
  3. 他に何かありますか?

リクエストフォームには、いくつかの顧客クラスフィールド、郵送先住所、および彼らが私たちを見つけた方法などのいくつかのフォームの詳細が収集されます。内容は重要ではなく、複数のポコからの情報を保持しているだけです。

MVCは、投稿されたフォームのフィールドを、次のようにActionMethodパラメーターのPocoのプロパティと一致させることを知っています。

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult RequestCatalog()

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog(Customer customer)

したがって、customer.firstNameは、投稿されたフォームのfirstNameに自動的にバインドされます。

私は次のものを持っています:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog(string fname, string lname, string address,
    string city, string state, string zip, string phone, string howTheyFoundUs)

しかし、次のようなものが必要です。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog( RequestForm requestForm)

何かご意見は?

4

2 に答える 2

2

まず、ドメイン モデルはランタイム フレームワーク (MVC) とは別に定義する必要があることを認識しておく必要があります。将来、ドメイン モデルを WCF サービス、WPF/Silverlight リッチ クライアント、バッチ ジョブなどとして公開できるようにする必要があると想像してみてください...

これは、すべてのモデリングが技術的な詳細によって制限されないようにする必要があることを意味します。データの保存方法とドメイン オブジェクトの消費方法の詳細は、設計プロセスのこの段階では (ほとんど) 無視する必要があります。

常に自問する必要があります: このクラスは純粋なドメインの一部として意味があるか?

特定のケースでは、入力のほとんどは、これに似た構造を持つ Customer クラスに属しているように聞こえます

public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Phone { get; set; }
    public Address Address { get; set; }
}

Address クラスも同様に定義されます。

ここで、自分自身 (または一緒に作業しているドメインの専門家) に尋ねる必要がある質問: はhowTheyFoundUsCustomer クラスに属していますか? それとも、それ自体がドメインの概念ですか? それとも、ドメイン モデルとはまったく関係のない単なるアプリケーション固有のデータですか? このような質問への答えは、入力をモデル化する方法を導きます。

余談ですが、上記の Phone プロパティは私には怪しげに見えますが、実装の詳細 (この場合は ASP.NET MVC) がモデルにどのように漏れる可能性があるかを示す非常に良い例です。

電話番号は実際にはそれ自体が値オブジェクトである必要があります (このテーマの関連処理については、このブログ投稿を参照してください) が、ASP.NET の既定の ModelBinder にはプリミット型が必要です。より良いオプションは、電話番号を適切なオブジェクトに解析できるカスタム ModelBinder を実装することです。

于 2009-12-07T08:34:54.807 に答える
1

アクション メソッドで Request.Form を使用することを止めるものは何もありません。

例えば

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog(Customer customer)
{
    var howTheyFoundUs = Request.Form["howTheyFoundUs"];

    // ...
}
于 2009-12-07T07:23:24.750 に答える