Mic*_*ern 3 c# data-access-layer
我有一个我的对象类型的应用程序,它继承自包含应用程序对象的大多数属性的基类.所有对象类型都存储在数据库的一个表中."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()
Run Code Online (Sandbox Code Playgroud)
我的问题是他们对这种处理有更好的实现吗?
如果您不想切换到生成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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,有了预装的映射器,您可以用以下代码替换代码:
string objectName = dr["ClassType"].ToString().ToLower();
Type objectType;
if (_objectTypes.TryGetValue(objectName, out objectType))
{
return (BaseEntity)Activator.CreateInstance(objectType,reader);
}
Run Code Online (Sandbox Code Playgroud)
将读者传递给对象的构造函数,以便它可以完全填充自己,这种类型的代码不属于工厂.