创建一个处理DatabaseFactory的DbContext,以便更轻松地使用DapperExtensions

时间:2017-02-27 04:01:39

标签: factory dapper dbcontext dapper-extensions

这一天,我尝试使用DapperExtensions提出的一些基本CRUD函数创建一个抽象基础存储库。但作为示例给出的代码使用SqlConnection,该SqlConnection用于连接到SQL Server数据库。我希望能够连接到所有类型的数据库(SQL Server,MySql等...)。此外,他们的代码示例将针对每个CRUD函数重复,如下面的代码所示

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

所以我正在考虑创建一个 DbContext ,它可以处理连接的创建,打开和关闭,也可以根据我想要使用的数据库类型创建正确的连接对象(一种数据库工厂)。

是否有人已经完成并可以分享他的代码?

谢谢你们!

2 个答案:

答案 0 :(得分:0)

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;
    }
 }

答案 1 :(得分:0)

您正在使用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 例如,使用Dapper-Extensions的代码,请参阅我最近发布的this回答。