大多数Dapper教程使用私有IDBConnection
对象来调用方法,即
private IDbConnection db = new SqlConnection(...)
使用ASP.NET和MVC 5时,我应该把它放在哪里,所以我不必在每个使用Dapper的控制器/存储库中重复它? 例如,有没有办法将它放在一个启动类中,并使用像ASP.NET Core中的依赖注入,或者在整个应用程序中访问它的一些其他技术?
答案 0 :(得分:2)
根据我的经验,最佳连接创建机制是DependencyInjection
和ConnectionFactory
的组合。
优势是多重的:
你将做什么(在代码中):
在数据访问层中声明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