使用直接sql的存储库模式

时间:2016-05-04 16:35:08

标签: oracle orm repository-pattern

我正在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还有更好的选择吗?

0 个答案:

没有答案