2

我有下面的表MVC3繼承問題

  • 業務(包含所有公共字段)
  • Business_Hotel數據庫(包含特定於酒店領域)
  • Business_Restaraunt(包含特定領域Restaraunts)
  • Business_Airport(包含特定於機場場)

我使用這些模型在EF傳承。

  • 業務(鹼)
  • 酒店(從商家繼承)
  • Restaraunts(從商家繼承)
  • 機場(從商家繼承)

我創建的控制器,與所述控制器在VS2010中使用基本實體(商業)創建嚮導

我想重新使用相同的創建所有三種類型的行動。

[HttpPost] 
public ActionResult CreateHotel(Business business) 
    { 


     if (ModelState.IsValid) 
     { 


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

如果我修改函數,如波紋管它不正確地創建的類型酒店

public ActionResult CreateHotel(Hotels business) 

業務所以,問題是我怎麼能做到這一點動態。有一個更好的方法嗎?

回答

4

作爲一個建議,它應該是更好的,你不要試圖重用Action(即使在DRY原則看起來很有魅力)

即使你能找到一種方法來做到這一點,在未來這將很難維持。

你所要做的是:

對待商務酒店,爲商務餐廳,任何那些爲商務機場。你看到有什麼問題嗎?一個酒店應該有自己的業務規則,對於機場和餐廳也是如此

如果你將來嘗試爲它們中的每一個添加一些特定的邏輯,你的操作方法會增加複雜性(順便說一句,操作方法應該只是調用模型以保持它們的清潔)。

這在藍皮書(DDD)被描述更好

所以我的建議是千萬不要再用這樣的邏輯(域邏輯),我親自嘗試重用基礎設施邏輯只

+0

並非總是如此,請考慮這種情況。一個動作可以作爲多種類型客戶端(silverlight,mvc)的單點聯繫人,現在用於增加功能,沒有人願意調用新動作,主要是,需求是使用與某些動作相同的動作更多的附加參數。在這種情況下,構建器模式非常方便,代碼複雜度很低。但是關注點的分離仍然完好無損,因爲構建器邏輯被移出控制器。 –

1

實現它的幾種方法。但是,自動生成的模型不會有幫助。

  1. 利用經典的生成器設計模式。定義一個視圖模型,它可以捕獲所有三種模型的數據,酒店,餐館,機場。在視圖模型中保留「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.直接採取的形式集合作爲輸入控制器而不是模型/視圖模型和動作方法,然後解析它並創建適當的對象。