创建一个处理DatabaseFactory以便更容易使用DapperExtensions的DbContext

问题描述:

这一天我尝试使用DapperExtensions提出的一些基本的CRUD函数创建一个抽象的基础知识库。但是,作为例子给出的代码使用SqlConnection来连接到SQL Server数据库。我希望能够连接到各种数据库(SQL Server,MySql等)。此外他们的代码样本重复如下面的代码显示创建一个处理DatabaseFactory以便更容易使用DapperExtensions的DbContext

using (SqlConnection cn = new SqlConnection(_connectionString)) 
{ 
    cn.Open(); 
    //Code doing something here... 
    cn.Close(); 
} 

,所以我想创造一个的DbContext,可以处理的创建,连接的开启和关闭,也可以创建每个CRUD功能正确的连接对象取决于我想要使用的数据库类型(一种数据库工厂)。

有没有人已经做到了,可以分享他的代码?

谢谢你们!

+0

这听起来像你正在试图建立一个真正的ORM的设施。您是否尝试过实体框架和NHibernate,并通过广泛的经验性基准测试得出结论:对于您的应用程序而言,这两者实际上都太慢了,因为您的服务具有令人难以置信的流行性,因此您拥有数百万条记录和极高的流量。 –

您正在使用Dapper-Extensions;以下代码仅适用于Dapper。但它并没有改变整个概念。而不是sql你需要通过poco

请参阅this回答我如何实施IUnitOfWorkDalSession。在下面的代码中,BaseDal就像BaseRepository

public abstract class BaseDal 
{ 
    internal BaseDal(IUnitOfWork unitOfWork) 
    { 
     dapperHandler = new DapperHandler(unitOfWork); 
    } 

    DapperHandler dapperHandler = null; 

    protected T Get<T>(string sql, DynamicParameters param) where T : class 
    { 
     var result = dapperHandler.Query<T>(sql, param).FirstOrDefault(); 
     return result; 
    } 

    protected List<T> GetList<T>(string sql, DynamicParameters param) where T : class 
    { 
     var result = dapperHandler.Query<T>(sql, param).ToList(); 
     return result; 
    } 

    protected int Insert(string sql, DynamicParameters param) 
    { 
     var result = dapperHandler.Execute(sql, param); 
     return result; 
    } 
} 

编辑1 对于小巧玲珑的扩展示例代码,请参阅this答案,我最近公布。

public abstract class ABaseRepository<M> : IBaseRepository<M> 
     where M : BaseModel 
    { 
     private static DbProviderFactory factory = DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ProviderName); 
     protected static DbConnection connection; 

    public static IDbConnection CreateOpenConnection() 
    { 
     connection = factory.CreateConnection(); 
     connection.Open(); 

     return connection; 
    } 

    public dynamic Insert(M model) 
    { 
     dynamic multiKey; 
     using (IDbConnection con = CreateOpenConnection()) 
     { 
      multiKey = con.Insert(model); 
     } 

     return multiKey; 
    } 
}