我有一个应用程序,我的对象类型继承自包含应用程序对象的大多数属性的基类。所有对象类型都存储在数据库的一个表中。 “ClassType”列确定将SqlDataReader行转换为的对象类型。
这是我目前的实施:
SqlDataReader dr = SqlServerHelper.ExecuteReader("MyStoreProc", MySqlParmas);
if(dr.HasRows)
{
while(dr.Read())
{
switch(dr["ClassType"].ToString())
{
case "ClassA":
//cast sqldatareader a ClassA object
ClassA a = new ClassFactory.CreateClassA(object p1, object p2);
case "ClassB":
//cast sqldatareader a ClassB object
ClassB b = new ClassFactory.CreateClassB(object p1, object p2);
//it continues for all objects with app....
}
}
}
dr.Close()
我的问题是他们是否可以更好地实施此类处理?
答案 0 :(得分:6)
如果您不想切换到生成ORM的代码,则采用此方法。
在对象表中,包括对象的完全限定类型名称。
然后,您可以执行以下操作:
private Dictionary<String, Type> _objectTypes = new Dictionary<String, Type>();
public ObjectFactory()
{
// Preload the Object Types into a dictionary so we can look them up later
foreach (Type type in typeof(ObjectFactory).Assembly.GetTypes())
{
if (type.IsSubclassOf(typeof(BaseEntity)))
{
_objectTypes[type.Name.ToLower()] = type;
}
}
}
现在,在预装了映射器的情况下,您可以用以下代码替换代码:
string objectName = dr["ClassType"].ToString().ToLower();
Type objectType;
if (_objectTypes.TryGetValue(objectName, out objectType))
{
return (BaseEntity)Activator.CreateInstance(objectType,reader);
}
将读者传递给对象的构造函数,以便它可以完全填充自己,这种类型的代码不属于工厂。
答案 1 :(得分:5)
我想我会倾向于使用Object-Relational Mapper。 NHibernate是.NET平台现有的,免费的,成熟的ORM解决方案的一个例子。
答案 2 :(得分:0)
LINQ to SQL可能是合法的选择。但是,对于没有使用主键和外键进行适当约束的数据库,它不能很好地发挥作用。它将根据表生成类。
答案 3 :(得分:0)
感谢所有反馈,但我不想实施第三方工具或新语言,因为我现在没时间学习它。
@Jonathan Hollard:
我的对象模块当前设计如下:
public class BaseClass
{
public BaseClass() { }
public object p1 { get; set;}
public object p2 { get; set; }
public virtual void ImplementLogic()
{
//do some fun stuff....
}
}
public class ClassA : BaseClass
{
public ClassA { }
public override void ImplementLogic()
{
//make it rain.....
}
}
public class ClassB : BaseClass
{
public ClassB { }
public override void ImplementLogic()
{
//do some more fun stuff
}
}
这个模型怎么样?
我是否会在BaseClassFactory构造函数中抛出第一个代码示例,因为它会识别从BaseClass继承的所有类?
答案 4 :(得分:0)
您可以在数据库中存储完全限定的类型名称,然后使用Activator.GetInstance
构建它。这将摆脱丑陋的switch语句,但会调用类型的构造函数而不是工厂方法。那会做你想要的吗?