使用通用接口构建视图

时间:2018-04-21 08:05:45

标签: asp.net-mvc inheritance interface asp.net-mvc-viewmodel

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

我有一个名为animal的表,它首先使用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(My Domain Classes与我的ViewModel不同,我使用ModelReader,ModelWriter和AutoMapper将我的域模型映射到我的视图模型{{ 3}})。我在ViewModel中有这个通用接口:

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

我在ViewModel中有这两个类:

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。

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

在我的视图中,我想使用Razor Code来显示基于Animal Model类型的某些属性,如下所示:

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

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

我一直在考虑这个问题,我不确定这是否是一个好的解决方案?我有很多不同的动物类型,有很多常见属性,所以不要为每种不同的动物创建一个表格。

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

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

另一个缺点是,在我的数据库中,我不知道每行包含哪种类型的动物......我想我可能需要在我的Animal表中添加一个ViewModelType列,但我不是确定这是一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我认为问题要坦诚得多。

你在谈论很多动物,但你可以根据类型进行思考,然后一切都会简化。 因此,基于一些非常快速的研究,您有6种动物类型:

  1. 脊椎动物
  2. 两栖动物
  3. 爬行动物
  4. 哺乳动物
  5. 你可以用更少的东西逃脱。因此,如果从这个角度来看你的问题,现在你没有那么多不同的类型可供查看。

    因此,请使用动物类型枚举并使用它来区分您正在显示的字段。 就数据库而言,我不会使用一个表和空字段,因为这会使一切变得复杂。要么创建一个基本的,每个类型都有一个单独的,或者使用Nosql db并每行保存一个类型数据。

    最后,我并不认为使用基本界面可以为您提供任何帮助。您仍然必须重复实现它的每个类中的字段,并且您在简化方面没有实现任何目标。如果您改为使用基本抽象类,那么至少您不必在任何地方重复相同的属性,而您的类现在更小并且正确地反映了差异。