应该在哪里放置IDBConnection以减少重复的代码?

时间:2016-10-27 15:11:26

标签: c# asp.net asp.net-mvc dapper

大多数Dapper教程使用私有IDBConnection对象来调用方法,即

private IDbConnection db = new SqlConnection(...)

使用ASP.NET和MVC 5时,我应该把它放在哪里,所以我不必在每个使用Dapper的控制器/存储库中重复它? 例如,有没有办法将它放在一个启动类中,并使用像ASP.NET Core中的依赖注入,或者在整个应用程序中访问它的一些其他技术?

1 个答案:

答案 0 :(得分:2)

根据我的经验,最佳连接创建机制是DependencyInjectionConnectionFactory的组合。

优势是多重的:

  • 在事务或线程范围内的运行时创建连接对象
  • 在运行时更改数据提供者,从而更改系统数据库(使用连接工厂)

你将做什么(在代码中):

在数据访问层中声明IDBConnection对象:

[Inject] // Property Injection
public IDBConnection Connection {get; set;}

使用像Ninject这样的DI框架声明绑定:

Bind<IDBConnection>().ToMethod(ctx => 
ConnectionFactory.CreateDbConnection("DefaultConnection"));

按如下方式创建DBConnection Factory:

连接工厂从配置文件中获取连接提供程序和连接字符串,如下所示:

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=<Value>;Initial Catalog=<Value>;User Id=<Value>;Password=<Value>" providerName="System.Data.SqlClient" />
</connectionStrings>

标识符为DefaultConnection,它使用的是SqlClient提供程序,但在运行时可以更改为不同的客户端,如Oracle, MySql

 using System;
 using System.Data.Common;

 public static class ConnectionFactory
    {
        /// <summary>
        /// Create DBConnection type based on provider name and connection string
        /// </summary>
        /// <param name="connectionIdentifier"></param>
        /// <returns></returns>
        public static DbConnection CreateDbConnection(string connectionIdentifier)
        {
            // Provider name setting
            var providerNameValue = ConfigurationManager.ConnectionStrings[connectionIdentifier].ProviderName;

            // Connection string setting
            var connectionStringValue = ConfigurationManager.ConnectionStrings[connectionIdentifier].ConnectionString;

            // Assume failure.
            DbConnection connection;

            // Null connection string cannot be accepted
            if (connectionStringValue == null) return null;

            // Create the DbProviderFactory and DbConnection.
            try
            {
                // Fetch provider factory
                var factory = DbProviderFactories.GetFactory(providerNameValue);

                // Create Connection
                connection = factory.CreateConnection();

                // Assign connection string
                if (connection != null)
                    connection.ConnectionString = connectionStringValue;
            }
            catch (Exception ex)
            {
                connection = null;
            }
            // Return the connection.
            return connection;
        }
}

如何使用它:

进行一次通话并处理

using(Connection)
{
 ...
}

对于交易上下文,按原样使用,不需要using