使用通用接口构建视图

building view using a generic interface

我正在开发 ASP.Net MVC 网站。

我有一个名为 animal 的 table,它是基于此 class 创建的,首先使用 Entity Framework 代码:

public class Animal
{
    public int AnimalId { get; set; }
    public string AnimalName { get; set; }
    public int NoOfLegs  { get; set; }

    public int FlyingSpeed { get; set; }
    public int RunningSpeed { get; set; }
}

现在我有我的 AnimalRepository,它从数据库中读取此信息并将其传递到我的 ViewModel(我的域 类 与我的 ViewModel 不同,我正在使用 ModelReader、ModelWriter 和 AutoMapper 来映射我的域模型进入我的视图模型 as explained here)。我的 ViewModel 中有这个通用接口:

public interface IAnimalModel
{
   int AnimalId { get; set; }
   string AnimalName { get; set; }
   int NoOfLegs  { get; set; }
}

我的 ViewModel 中有这两个 class:

public class DogModel: IAnimalModel
{
    public int AnimalId { get; set; }
    public string AnimalName { get; set; }
    public NoOfLegs  { get; set; }

    public int RunningSpeed { get; set; }
}

public class EagleModel: IAnimalModel
{
    public int AnimalId { get; set; }
    public string AnimalName { get; set; }
    public NoOfLegs  { get; set; }

    public int FlyingSpeed { get; set; }
}

现在我有一个 Animal Controller,它使用 AnimalRepositoy 从 DB 获取数据,并将其映射到正确的 ViewModel。

我想将我的视图绑定到 IAnimalModel 接口,以便我可以将不同的动物传递给同一个视图。

在我的视图中,我想使用 Razor 代码根据动物模型类型显示某些属性,如下所示:

@if (typeof(Model) == typeof(EagleModel)) {
   Html.EditorFor(model => model.FlyingSpeed)
}

@if (typeof(Model) == typeof(DogModel)) {
   Html.EditorFor(model => model.RunningSpeed)
}

这个问题我想了很久,不知道是不是一个好的解决方案?我有很多具有很多共同属性的不同动物类型,所以我不太喜欢为每种不同的动物创建一个 Table 的想法。

我认为最好将它们映射到我的 ViewModel 中的正确类型...

我不确定将我的 ViewModel 绑定到 IAnimalModel 接口是否是个好主意?因为我需要在显示某些属性之前检查模型类型。

另一个缺点是,在我的数据库中,我不知道每一行包含哪种类型的动物...我在想也许我必须向我的动物 table 添加一个 ViewModelType 列,但是我再次不确定这是否是一个好的解决方案?

老实说,我认为这个问题要简单得多。

你说的是很多动物,但你可以从类型的角度考虑,然后一切都简化了。 所以根据一些非常快速的研究,你有 6 种动物类型:

  1. 无脊椎动物
  2. 两栖动物
  3. 爬行动物
  4. 鸟类
  5. 哺乳动物

你或许可以少花点钱。所以如果你从这个角度来看你的问题,现在你没有那么多不同的类型可以看。

所以,有一个动物类型枚举并使用它来区分您正在显示的字段。 在数据库方面,我不会使用一个 table 和空字段,因为这会使一切复杂化。要么用任何常见的东西创建一个基础数据,然后为每种类型创建一个单独的数据,或者使用 Nosql 数据库并每行保存一种类型的数据。

最后,我真的不认为使用基本接口会给您带来任何好处。您仍然必须在实现它的每个 class 中重复这些字段,并且您在简化方面没有取得任何成就。如果您改为使用基础抽象 class,那么至少您不必在所有地方重复相同的属性,并且您的 classes 现在更小并且可以正确反映差异。