使用通用接口构建视图
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 种动物类型:
- 无脊椎动物
- 鱼
- 两栖动物
- 爬行动物
- 鸟类
- 哺乳动物
你或许可以少花点钱。所以如果你从这个角度来看你的问题,现在你没有那么多不同的类型可以看。
所以,有一个动物类型枚举并使用它来区分您正在显示的字段。
在数据库方面,我不会使用一个 table 和空字段,因为这会使一切复杂化。要么用任何常见的东西创建一个基础数据,然后为每种类型创建一个单独的数据,或者使用 Nosql 数据库并每行保存一种类型的数据。
最后,我真的不认为使用基本接口会给您带来任何好处。您仍然必须在实现它的每个 class 中重复这些字段,并且您在简化方面没有取得任何成就。如果您改为使用基础抽象 class,那么至少您不必在所有地方重复相同的属性,并且您的 classes 现在更小并且可以正确反映差异。
我正在开发 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 种动物类型:
- 无脊椎动物
- 鱼
- 两栖动物
- 爬行动物
- 鸟类
- 哺乳动物
你或许可以少花点钱。所以如果你从这个角度来看你的问题,现在你没有那么多不同的类型可以看。
所以,有一个动物类型枚举并使用它来区分您正在显示的字段。 在数据库方面,我不会使用一个 table 和空字段,因为这会使一切复杂化。要么用任何常见的东西创建一个基础数据,然后为每种类型创建一个单独的数据,或者使用 Nosql 数据库并每行保存一种类型的数据。
最后,我真的不认为使用基本接口会给您带来任何好处。您仍然必须在实现它的每个 class 中重复这些字段,并且您在简化方面没有取得任何成就。如果您改为使用基础抽象 class,那么至少您不必在所有地方重复相同的属性,并且您的 classes 现在更小并且可以正确反映差异。