从单一类型创建不同的POCO

时间:2011-01-05 06:00:31

标签: .net design-patterns poco

我正在SCADA数据库周围写一个包装库,我有一个小的'嬉皮士代码设计'问题。它涉及我如何将提供的DB对象转换为POCO。

我使用供应商.NET库调用数据库。

当我调用DB时,它会传回一个DBObject类型的对象。这可以表示数据库中的任何内容,因此在它所拥有的信息中非常通用。使用DBObject.GetProperty()方法调用从DB访问任何自定义信息,这需要连接到DB才能激活。

我希望将这个基本的DBObject转换为各种不同的POCO,以便我可以通过WCF和其他技术传递它们。

目前我有一个名为ScadaObject的抽象基类,它有许多基本属性,我想要包含所有POCO,以及一个名为InternalFromDBObject(DBObject obj)的受保护虚拟方法,它从{{DBObject执行此创建。 1}}进入POCO。

在我的派生类型中,我重写此方法,调用base.InternalFromDBObject(obj)作为第一个调用,然后继续加载任何自定义/特定信息。然后我在POCO上有一个名为FromDBObject()的静态方法,它返回该POCO的新实例。

这是一种做事的好方法吗?我在使用工厂方面经验不足,所以我不确定它们是否合适。我可以使用其他任何设计模式吗?

1 个答案:

答案 0 :(得分:0)

您可以创建您的poco类而不必从任何内容派生,只需添加到匹配返回的DBObject的名称和类型的poco公共属性。然后,您可以创建一个外部静态类,其中包含一个(和一个集合)DBobject并返回您的poco的一个(或一个集合)。

static class ScadaTOPoco
{
   public static TPoco Create<TPoco>(DbObject sb){...}
   public static IEnumerable<TPoco> Create<TPoco>(IEnumerable<DbObject> sb){...}
}

内部的每种方法都可以:

  • 实例化poco
  • 使用反射获取POCO

  • 上的公共属性列表
  • 在每个属性上循环,并使用DBobject.GetProperty分配目标poco对象中的值。确保通过调用Convert.ChangeType转换为目标属性类型中的正确值来转换该值。

如果scada中的属性名称不符合.NET命名约定,则可以嵌入一些约定来从scada映射到.NET ...