MVC 4中的面向对象设计/实现

时间:2013-10-02 22:07:31

标签: c# asp.net-mvc oop database-design

我有OO设计/数据库问题。我正在使用实体框架5在Microsoft MVC v4中编码。 假设模型如下:

public class Car
{
  public int Id {get; set;}
  public string Name {get; set; }
  public int Wheels {get; set;}
}
public class Truck : Car
{
  public int CargoCapacity {get; set;}
}
public class Bus : Car
{
  public int PassangerCapacity {get; set;}
}

稍后我可能想要扩展模型,因此必须考虑这一点。例如:添加一辆具有'NumberOfTurbos'属性的赛车。

遵循良好的OO设计原则:

问题1: 这些都应该在单独的类中,还是全部在一起使用修饰符。 从OO方面看原则分离我会说它们分开了。同样关闭/打开原则规定它们应该拆分,这将有助于我以后添加赛车时不必更改任何有关公共汽车,卡车等的信息。

问题2: 他们都应该在同一个数据库表中吗?即使我不认为类的数量应该决定表的数量,我仍然会选择单独的表,以便DB被标准化,并且整个地方都没有未使用的字段。默认情况下,代码优先将它全部放在一个表中,但我已将它与类模式属性分开。

问题3: 如果我应该编程到一个接口而不是一个具体的类(OO原则再次)将如何工作,因为如果我有类似ICar的东西,这是由具体的类汽车实现的,将东西投射到ICar是行不通的。像List< ICar>不会给我所有正确的数据。同时对接口ICAR实现MVC视图也很困难。

我是否应该将接口放在仅属性类上?我应该在这里使用类似存储库或其他模式/想法的东西吗?

为长期问题道歉,我感谢任何帮助。 提前致谢。 麦克

3 个答案:

答案 0 :(得分:0)

回答1:

是的,这些应该分成多个类。您可以通过将Car标记为抽象来进一步扩展它,因为它是其他类型汽车的基类。您还必须将属性标记为抽象,如下所示:

abstract class Car
{
    abstract public int Id;
}

虽然更好的名称可能是Vehicle

回答2:

您可以将这些内容存储在一个名为Vehicle的表中,并有一个VehicleType表。

表格工具:

  

Id VehicleName VehicleType

     

1丰田1

     

2川崎2

表格VehicleType:

  

Id VehicleDescription

     

1辆汽车

     

2摩托车

     

3卡车

回答3:

如果您使用了一个接口并拥有一个List,那么您将被限制为ICar接口公开的属性/字段。但是,您可以将其转换为适当的VehicleType。

答案 1 :(得分:0)

  

问题1:这些都应该是单独的类,还是全部都带有修饰符。从OO方面看原则分离我会说它们分开了。同样关闭/打开原则规定它们应该拆分,这将有助于我以后添加赛车时不必更改任何有关公共汽车,卡车等的信息。

现实地分类,每个项目类型一个类。这也将是未来的证据,因为您对任何类别的任何更改都不一定会影响其他类。将来分享的任何添加内容都可以存在于基类中。


  

问题2:它们是否都在同一个数据库表中?即使我不认为类的数量应该决定表的数量,我仍然会选择单独的表,以便DB被标准化,并且整个地方都没有未使用的字段。默认情况下,代码优先将它全部放在一个表中,但我已将它与类模式属性分开。

绝对不是。是的,它更容易查询,但您查询的数据量实际上会增加。另外,你有效地对你的数据库设计进行了非规范化处理,更不用说有一堆可以为空的字段了,如果一种类型需要它们而不是其他类型,那么可能需要一些丑陋的逻辑来验证。


  

问题3:如果我应该编程到一个接口而不是一个具体的类(OO原则再次)将如何工作,因为如果我有类似ICar的东西,由具体的类汽车实现,把东西送到ICar不管用。像List< ICar>不会给我所有正确的数据。同时对接口ICAR实现MVC视图也很困难。

你不是假设要编程接口,你应该选择完全依赖于实现的接口/基类。我在你的例子中说,只需使用一个基类(像VehicleBase这样你可以将所有共享属性放在其中。

答案 2 :(得分:0)

  1. 是的,他们应该在不同的班级。模型中的实体shoudnt具有逻辑上不“属于”它们的属性。在处理Truck时,设置或阅读PassangerCapacity很可能没有意义。这只会令人困惑。

  2. 这是在ORM层中做出的选择(在您的情况下为EF)。 EF支持单个表,其中包含所有子类的属性列,以及子类的多个表。两种选择都有其优点。单个表具有较少的连接,因此它可能更快,但是几个表减少了数据库必须存储,读取和写入的列数,因此在存储时它可能更有效。这一切也取决于实际数据集的外观。然而,这将由ORM层(EF)抽象,因此在您的对象模型中它们应该仍然是分开的。

  3. 如果您的代码需要处理卡车,您应该让它处理卡车,对于只关心汽车的地方,请使用ICar。您的数据库层可以公开汽车,卡车和赛车的数据集。