2

次のテーブルを持つデータベースがあります

  • ビジネス (すべての共通フィールドを含む)
  • Business_Hotel (ホテルに固有のフィールドを含む)
  • Business_Restaraunt (レストラン固有のフィールドを含む)
  • Business_Airport (空港に固有のフィールドを含む)

これらは、継承を使用して EF でモデル化しました。

  • 事業内容(拠点)
  • ホテル(事業承継)
  • レストラン(事業承継)
  • 空港(事業承継)

Base Entity (Business) を使用して、VS2010 のコントローラー作成ウィザードでコントローラーを作成しました。

3 つのタイプすべてに同じ Create アクションを再利用したいと考えています。

 [HttpPost]
 public ActionResult CreateHotel(Business business)
    {


        if (ModelState.IsValid)
        {


            db.Businesses.AddObject(business);        
            db.SaveChanges();
            return RedirectToAction("Index");
        }

以下に示すように関数を変更すると、ホテル タイプのビジネスが正しく作成されます。

 public ActionResult CreateHotel(Hotels business)

問題は、これを動的に行う方法です。これを行うより良い方法はありますか?

4

2 に答える 2

4

アドバイスとして、単一のものを再利用しようとしない方が良いはずですAction(DRY 原則が魅力的に見える場合でも)。

それを行う方法を見つけることができたとしても、将来これを維持するのは難しいでしょう.

あなたがやろうとしていることは次のとおりです。

ビジネス ホテルをビジネス レストランとして扱い、それらのいずれかをビジネス エアポートとして扱います。何が悪いのか分かりますか?ホテルには、空港やレストランと同じように、独自のビジネス ルールが必要です。

将来、それぞれに特定のロジックを追加しようとすると、アクション メソッドの複雑さが増します (ところで、アクション メソッドは、モデルをクリーンに保つためにのみモデルを呼び出す必要があります)。

これはブルーブック (DDD)でよりよく説明されています。

したがって、私のアドバイスは、この種のロジック (ドメイン ロジック) を再利用しないことです。個人的には、インフラストラクチャ ロジックのみを再利用しようとしています。

于 2012-06-02T20:39:34.060 に答える
1

それを達成するためのいくつかの方法。ただし、自動生成されたモデルは役に立ちません。

  1. 古典的なビルダー デザイン パターンを活用します。ホテル、レストラン、空港の 3 つのモデルすべてのデータを取得できるビューモデルを定義します。ビュー モデルでは、「BusinessType」などのような識別子と、型を見て適切なビジネス オブジェクトを作成する関数を保持します。識別子は、UI で静的または動的に設定する必要があります。

    public class BusinessViewModel 
    {
    
      // all attributes go here.
      public int BusinessType { get; set; }
    
      public Businesses CreateBusinessObject()
      {
        if(BusinessType == "1")
            //Create and return a new Hotel
      }
    }
    

コントローラーでは、次のように使用されます。

    [HttpPost]
     public ActionResult CreateHotel(BusinessViewModel businessVM)
    {


        if (ModelState.IsValid)
       {
            Businessess business = businessVM.CreateBusinessObject()

        db.Businesses.AddObject(business);        
        db.SaveChanges();
        return RedirectToAction("Index");
       }

2.モデル/ビューモデルではなく、コントローラーのアクションメソッドの入力としてフォームコレクションを直接取得し、それを解析して適切なオブジェクトを作成します。

于 2012-06-03T08:23:16.583 に答える