2

我有一个包含以下表格的数据库

  • 业务(包含所有常见字段)
  • Business_Hotel(包含特定于酒店的字段)
  • Business_Restaraunt(包含特定于 Restaraunts 的字段)
  • Business_Airport(包含特定于机场的字段)

我使用继承在 EF 中对这些进行了建模。

  • 企业(基地)
  • 酒店(从企业继承)
  • 餐厅(从企业继承)
  • 机场(从企业继承)

我使用基本实体(企业)在 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

2 回答 2

4

作为建议,最好不要尝试重用单个Action(即使 DRY 原则看起来很吸引人)

即使您可以找到一种方法来做到这一点,将来也很难维持。

你想要做的是:

将商务酒店、商务餐厅以及任何商务酒店视为商务机场。你看到有什么问题吗?酒店应该有自己的商业规则,对于机场和餐厅也是如此

如果您将来尝试为它们中的每一个添加一些特定的逻辑,您的操作方法将会增加复杂性(顺便说一句,操作方法应该只调用模型以保持它们干净)。

这在蓝皮书 (DDD)中有更好的描述

所以我的建议是不要重用这种逻辑(域逻辑),我个人尝试只重用基础架构逻辑

于 2012-06-02T20:39:34.060 回答
1

实现它的几种方法。但是,自动生成的模型无济于事。

  1. 利用经典的构建器设计模式。定义一个视图模型,它可以捕获所有三个模型(Hotels、Restaraunts、Airports)的数据。在视图模型中保留一个区分符,如“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.在控制器中的action方法中直接将表单集合作为输入,而不是模型/视图模型,然后对其进行解析并创建适当的对象。

于 2012-06-03T08:23:16.583 回答