gpt4 book ai didi

c# - IDBConnection应该放在哪里,减少重复代码?

转载 作者:太空狗 更新时间:2023-10-29 21:53:07 25 4
gpt4 key购买 nike

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

private IDbConnection db = new SqlConnection(...)

当使用 ASP.NET 和 MVC 5 时,我应该把它放在哪里,这样我就不必在使用 Dapper 的每个 Controller /存储库中重复它?例如,有没有办法将它放在启动类中并像在 ASP.NET Core 中那样使用依赖注入(inject),或者使用其他技术在整个应用程序中访问它?

最佳答案

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

优点是多方面的:

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

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

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

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

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

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

按如下方式创建 DBConnection 工厂:

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

<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

关于c# - IDBConnection应该放在哪里,减少重复代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40288262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com