【发布时间】:2016-04-11 18:05:13
【问题描述】:
我有一个如下所示的代码结构。我知道这个例子有点奇怪,但我正在处理的实体在结构上是相似的。
interface IAnimal
{
string name {get; set;}
int Age { get; set;}
string AnimalType { get; set;}
ICollection<Dependent> Dependents{get; set;}
}
interface IDependent : IAnimal
{
string RelationshipToParent{get; set;}
}
class Dependent : IDependent
{
public string name { get; set;}
public int Age { get; set;}
public string AnimalType { get; set;}
public string RelationshipToParent { get; set;}
public ICollection<Dependent> Dependents { get; set;}
}
class Animal : IAnimal
{
public string name { get; set;}
public int Age { get; set;}
public string AnimalType{get; set;}
public ICollection<Dependent> Dependents { get; set;}
}
class Tiger : IAnimal
{
public string name { get; set;}
public int Age { get; set;}
public string AnimalType{get; set;}
public ICollection<Dependent> Dependents { get; set;}
}
class Dog : IAnimal
{
public string name { get; set;}
public int Age{ get; set;}
public string AnimalType{get; set;}
public ICollection<Dependent> Dependents{ get; set;}
}
class DogDependent : Dependent
{
}
class TigerDependent : Dependent
{
}
动物可以像任何其他动物一样有家属(例如..老虎可以像狗和大象一样有家属) Animal 和 Dependent 类是 SQL Server 中的持久实体(使用实体框架)。 我的问题是我有大约 20 个这样的具体动物。从 DB 中读取实体后,我需要一种复杂的方法来将 Animal 转换为具体类型,如 Tiger、Dog 等。基于 AnimalType 属性。
例子.. 如果 Animal 对象的 AnimalType 为“Tiger”,则 Animal 应转换为 Tiger 类型(具有所有属性)。家属也是如此,如果该动物类型的 Dependent 是 Dog,则 Dependent 应转换为 DogDependent。
有没有更好的方法来做到这一点,而不是为每种类型编写一个映射器?
【问题讨论】:
-
请提供某种形式的可编译代码。你有带字段的接口,没有类型的类成员字段等等。很难将伪问题与实际问题区分开来。
-
@grek40 更新了代码
-
关于您的代码的一些我不明白的地方:接口应该描述行为,即您的对象可以执行的操作。根据这个 Animal 应该是一个类,也许是抽象的。您的具体动物不会在基础动物上添加任何功能,所以我认为没有必要,您可以只使用基础动物并将具体动物作为动物的属性。所有这些都会将上述模型简化为只有两个类。
-
@klink 接口中定义了行为,为了举例,我删除了代码中的函数。
标签: c# .net entity-framework design-patterns