实体映射方案,我选择的一种

在写之前,我承认我是个懒人。

 

现今,分层应用很常见,也少不了数据表与编程语言类/结构的一个映射。

 

时下很流行反射映射,相比之下省了点事,产生的问题终究要面对的。

 

如果用传统数据访问层给实体模型赋值,且不论用具体的方法调用。但有一点,通常都是在数据访问层给实体各属性赋值,一有修改,此处必少不了修改。

 

如果一个项目就几个实体,也就算了。可我还是个懒人。

 

有没有更灵活的方法,性能上得能去,灵活性又强?

 

且看我的做法:

 

声明一个泛型接口 ICreateModel,含方法一个CreateModel,代码如下

 

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
namespace Moli.Framework
{
public interface ICreateModel<TModel>
{
TModel CreateModel(DbDataReader reader);
}
}

 

建一个抽象实体模型ModelBase,实现此接口

 

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Data.Common;
namespace Moli.Framework
{
[Serializable]
public abstract class ModelBase<T,TKeys>:ICreateModel<T>
where T:ModelBase<T,TKeys>
{
public ModelBase()
{
}

public TKeys Id { get; set; }


protected abstract T InternalCreateModel(DbDataReader reader);
public T CreateModel(DbDataReader reader)
{

return this.InternalCreateModel(reader);
}
}
}

 

 

数据访问层DataAccessBase调用此接口

 

代码
public TModel CreateModel<TModel>(string name,IDictionary<string,object> filter)
where TModel:ICreateModel<TModel>,new()
{
TModel model
= new TModel();

this.TryCatch(this.GetDbCommand(name,filter), delegate(DbCommand command)
{
var reader
=command.ExecuteReader();
if (reader.Read())
{
model
= model.CreateModel(reader);
}
reader.Close();
});
return model;
}

 

示例

 

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Moli.Framework.Test
{
class TestModel:ModelBase<TestModel,string>
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
protected override TestModel InternalCreateModel(System.Data.Common.DbDataReader reader)
{
//整个都可以用工具生成,此法要求数据表列类型,名称对应,当然还有更灵敏写法,
var i = -1;
if (reader.IsDBNull(++i))
{
this.Age = reader.GetInt32(i);
}
if (reader.IsDBNull(++i))
{
this.Name = reader.GetString(i);
}

return this;
}

}
}

 

以上问题都能很好解决,写的不好请多指教!

posted @ 2010-12-04 23:13  赤脚上阵  阅读(314)  评论(0编辑  收藏  举报