【问题标题】:Obtain DB Data in Polymorphism获取多态中的数据库数据
【发布时间】:2014-07-20 15:06:40
【问题描述】:

我有基类和多个派生类,就像这样:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }    
}

public class Parent : Person
{
    public int Age { get; set; }
}

public class Child : Person
{
    public int Grade { get; set; }
    public Parent Father { get; set; }
    public Parent Mother { get; set; }
}

每个类在数据库中都有一个表,带有一个适当的字段。

当我想从数据库中获取数据并初始化一个人的实例时,我需要为每个属性设置值,如下所示:

Name = reader["Name"].ToString();
Age = int.Parse(reader["Age"].ToString());

现在,我不想在每个派生类上都这样做,但通常在基类中这样做。 最好的方法是什么?谢谢。

【问题讨论】:

    标签: c# oop polymorphism


    【解决方案1】:

    首先,您可以在此处找到的最佳答案是:采用 OR/M,例如 Entity Framework、NHibernate 或 Dapper(或任何其他),并将您的精力集中在您的业务上,而不是浪费精力您在基础设施细节上的时间!

    另一方面,如果您想要一种使用自己的代码解决问题的方法,我会说您需要创建数据映射器的概念。它将是一个应该定义关系和面向对象对应物之间映射的类。

    这样,当您尝试获取派生类时,您会实例化基类和派生类数据映射器,并调用它们以获取整列数据:

    DerivedClass derivedClassInstance = new DerivedClass();
    
    DerivedClassDataMapper derivedMapper = new DerivedClassDataMapper(derivedClassInstance, dataReader);
    derivedMapper.Fetch();
    
    // Now your derivedClassInstance reference will contain an object which
    // has both data from base and derived class...
    

    最后,我想说两个数据映射器都应该从DataMapper 基类继承,其中Fetch 方法应该标记为virtual(或abstract),以便让派生数据映射器添加更多映射代码(这样,基映射器会将属性映射到基类中定义的列,派生类将覆盖Fetch 以添加更多映射等等......)。

    无论如何,您不应该重新发明轮子,因为存在可靠的对象关系映射器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多