我正在oracle数据库上写一个数据访问层但由于某种原因我不能使用NHibernate或任何其他ORM。所以我决定提出以下解决方案。
Domain类的类库。
public class DomainClass
{
public int Id { get; set; }
public string Name { get; set; }
public string Output { get; set; }
}
包含存储库的数据访问的类库。
public class DomainClassRepository : IDomainClassRepository
{
private readonly IOracleContext _oracleContext;
public DomainClassRepository(IOracleContext oracleContext)
{
_oracleContext = oracleContext;
}
public IList<DomainClass> GetAll()
{
return _oracleContext.GetRecords("select * from DomainClassTable", MapFromDataReader);
}
private static DomainClass MapFromDataReader(OracleDataReader dataReader)
{
return new Domain
{
Id = int.Parse(dataReader["ID"].ToString()),
Name = dataReader["NAME"].ToString(),
Output = dataReader["OUTPUT"].ToString()
};
}
}
OracleContext的定义如下: -
public class OracleContext : IOracleContext
{
public void Connect()
{
try
{
_conn = new OracleConnection(_dalSettings.ConnectString);
_conn.Open();
}
catch (Exception ex)
{
Log.Error(ex);
_conn = null;
}
}
public IList<T> GetRecords<T>(string sqlStatment, Func<OracleDataReader, T> mapper)
{
OracleDataReader dr = null;
try
{
var cmd = new OracleCommand(sqlStatment, Conn);
dr = cmd.ExecuteReader();
var result = new List<T>();
while (dr.Read())
{
var mappedObject = mapper(dr);
if (mappedObject != null)
{
result.Add(mappedObject);
}
}
return result;
}
catch (Exception ex)
{
Log.Error(ex, "DatabaseAccess", "GetRecords");
throw;
}
finally
{
if (dr != null)
dr.Close();
}
}
存储库提供了一个映射器函数,用于将datareader映射到域对象。这种设计允许我对除OracleContext和Mapper函数之外的所有内容进行单元测试。
专家提问。你觉得这个模式有什么问题吗?没有使用ORM还有更好的选择吗?