我正在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的新实例。
这是一种做事的好方法吗?我在使用工厂方面经验不足,所以我不确定它们是否合适。我可以使用其他任何设计模式吗?
答案 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
在每个属性上循环,并使用DBobject.GetProperty分配目标poco对象中的值。确保通过调用Convert.ChangeType转换为目标属性类型中的正确值来转换该值。
如果scada中的属性名称不符合.NET命名约定,则可以嵌入一些约定来从scada映射到.NET ...