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.直接采取的形式集合作为输入控制器而不是模型/视图模型和动作方法,然后解析它并创建适当的对象。