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

gfa*_*t22 6 c# asp.net asp.net-mvc dapper

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

private IDbConnection db = new SqlConnection(...)
Run Code Online (Sandbox Code Playgroud)

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

Mri*_*boj 2

根据我的经验,最好的连接创建机制是DependencyInjection和的组合ConnectionFactory

优点是多重:

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

你应该做什么(在代码中):

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

[Inject] // Property Injection
public IDBConnection Connection {get; set;}
Run Code Online (Sandbox Code Playgroud)

使用 Ninject 等 DI 框架声明绑定:

Bind<IDBConnection>().ToMethod(ctx => 
ConnectionFactory.CreateDbConnection("DefaultConnection"));
Run Code Online (Sandbox Code Playgroud)

创建 DBConnection Factory 如下:

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

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=<Value>;Initial Catalog=<Value>;User Id=<Value>;Password=<Value>" providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

标识符是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;
        }
}
Run Code Online (Sandbox Code Playgroud)

如何使用它:

对于单个调用和处置

using(Connection)
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

对于事务上下文,按原样使用,using无需