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中的依赖注入,或者在整个应用程序中使用其他技术来访问它?
根据我的经验,最好的连接创建机制是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无需
| 归档时间: |
|
| 查看次数: |
924 次 |
| 最近记录: |