我的域模型提供例如以下对象Report : IEntity<Report>
。我通常从存储过程中检索 Oracle 用户定义类型对象(或集合类型)。对于所有类型的 C# 类都由 ODP.NET Visual Studio 自定义类向导生成。所以我有以下课程,例如:
public class UDT_REPORT : INullable, IOracleCustomType, IXmlSerializable {
private bool m_IsNull;
private decimal m_REPORT_ID;
private decimal m_VALUE;
// etc
}
目前我正在尝试为 C# 应用程序创建一个新的数据访问层。我想在这种情况下应用存储库模式,以实现松散耦合和更好的可测试性。但是如何将这些生成的类集成到存储库中呢?如何设计ReportRepository
课堂?
public interface IReportRepository
{
Report Find(ReportId id);
IList<Report> FindAll();
void Store(Report Report);
}
我应该使用以下方法吗?一个静态 DB 代理类,例如公开Read<T>()
具有给定委托的通用方法,用于数据检索和映射。还有一个用于创建数据库提供者的工厂。
public static T Read<T>(string sql, Func<IDataReader, T> fetch, object[] parms = null)
{
using (var connection = factory.CreateConnection())
{
connection.ConnectionString = connectionString;
using (var command = factory.CreateCommand())
{
// Add connection; sql command text;
// add parameters via some extension method
// Open and close connection
T t = default(T);
var reader = command.ExecuteReader();
if (reader.Read()) {
t = fetch(reader);
}
return t;
}
}
}
下面的委托用于获取相关的 UDT 对象并将其映射到域对象,例如Report
。
private static Func<IDataReader, Customer> Fetch = reader =>
{
UDT_REPORT report = reader.GetValue(reader.GetOrdinal("out_param_report"));
Report report = Mapping.Map(reportEntity);
return report;
};
您如何看待这种方法?在存储库中集成 ODP.NET 类型是否有更好的方法?或者我应该避免生成 UDT 类并添加一些 ORM 框架?