dapper 连接mysql_如何在.NET中使用Dapper处理数据库连接?
Microsoft.AspNetCore.All:v2.0.3 | Dapper:v1.50.2
我不確定我是否正確地使用了最佳實踐,但是我這樣做是為了處理多個連接字符串。
如果只有1個連接字符串,這很容易
Startup.cs
using System.Data;
using System.Data.SqlClient;
namespace DL.SO.Project.Web.UI
{
public class Startup
{
public IConfiguration Configuration { get; private set; }
// ......
public void ConfigureServices(IServiceCollection services)
{
// Read the connection string from appsettings.
string dbConnectionString = this.Configuration.GetConnectionString("dbConnection1");
// Inject IDbConnection, with implementation from SqlConnection class.
services.AddTransient((sp) => new SqlConnection(dbConnectionString));
// Register your regular repositories
services.AddScoped();
// ......
}
}
}
DiameterRepository.cs
using Dapper;
using System.Data;
namespace DL.SO.Project.Persistence.Dapper.Repositories
{
public class DiameterRepository : IDiameterRepository
{
private readonly IDbConnection _dbConnection;
public DiameterRepository(IDbConnection dbConnection)
{
_dbConnection = dbConnection;
}
public IEnumerable GetAll()
{
const string sql = @"SELECT * FROM TABLE";
// No need to use using statement. Dapper will automatically
// open, close and dispose the connection for you.
return _dbConnection.Query(sql);
}
// ......
}
}
如果連接字符串超過1個,則會出現問題
由于Startup利用DbConnection,因此您需要考慮一種區分不同數據庫連接的方法。
我嘗試創建多個接口(從Startup繼承),分別對應于不同的數據庫連接,并在SqlConnection上注入具有不同數據庫連接字符串的DbConnection。
之所以失敗是因為Startup繼承自DbConnection,并且SqlConnection不僅補充了IDbConnection,而且補充了Component類。 因此,您的自定義界面將無法僅使用SqlConnection功能。
我還嘗試創建自己的Startup類,該類采用不同的連接字符串。 這太復雜了,因為您必須實現DbConnection類中的所有方法。 您失去了SqlConnection的幫助。
我最終要做什么
在Startup期間,我將所有連接字符串值加載到字典中。 我還為所有數據庫連接名稱創建了IDbConnection,以避免魔術字符串。
我將字典作為Singleton注入。
我沒有注入IDbConnection,而是創建了IDbConnectionFactory,并將其作為所有存儲庫的Transient注入。 現在所有存儲庫都采用IDbConnectionFactory,而不是IDbConnection。
何時選擇正確的連接? 在所有存儲庫的構造函數中! 為了使內容整潔,我創建了存儲庫基類,并使存儲庫從基類繼承。 正確的連接字符串選擇可以在基類中進行。
DatabaseConnectionName.cs
namespace DL.SO.Project.Domain.Repositories
{
public enum DatabaseConnectionName
{
Connection1,
Connection2
}
}
IDbConnectionFactory.cs
using System.Data;
namespace DL.SO.Project.Domain.Repositories
{
public interface IDbConnectionFactory
{
IDbConnection CreateDbConnection(DatabaseConnectionName connectionName);
}
}
DapperDbConenctionFactory-我自己的工廠實現
namespace DL.SO.Project.Persistence.Dapper
{
public class DapperDbConnectionFactory : IDbConnectionFactory
{
private readonly IDictionary _connectionDict;
public DapperDbConnectionFactory(IDictionary connectionDict)
{
_connectionDict = connectionDict;
}
public IDbConnection CreateDbConnection(DatabaseConnectionName connectionName)
{
string connectionString = null;
if (_connectDict.TryGetValue(connectionName, out connectionString))
{
return new SqlConnection(connectionString);
}
throw new ArgumentNullException();
}
}
}
Startup.cs
namespace DL.SO.Project.Web.UI
{
public class Startup
{
// ......
public void ConfigureServices(IServiceCollection services)
{
var connectionDict = new Dictionary
{
{ DatabaseConnectionName.Connection1, this.Configuration.GetConnectionString("dbConnection1") },
{ DatabaseConnectionName.Connection2, this.Configuration.GetConnectionString("dbConnection2") }
};
// Inject this dict
services.AddSingleton>(connectionDict);
// Inject the factory
services.AddTransient();
// Register your regular repositories
services.AddScoped();
// ......
}
}
}
DiameterRepository.cs
using Dapper;
using System.Data;
namespace DL.SO.Project.Persistence.Dapper.Repositories
{
// Move the responsibility of picking the right connection string
// into an abstract base class so that I don't have to duplicate
// the right connection selection code in each repository.
public class DiameterRepository : DbConnection1RepositoryBase, IDiameterRepository
{
public DiameterRepository(IDbConnectionFactory dbConnectionFactory)
: base(dbConnectionFactory) { }
public IEnumerable GetAll()
{
const string sql = @"SELECT * FROM TABLE";
// No need to use using statement. Dapper will automatically
// open, close and dispose the connection for you.
return base.DbConnection.Query(sql);
}
// ......
}
}
DbConnection1RepositoryBase.cs
using System.Data;
using DL.SO.Project.Domain.Repositories;
namespace DL.SO.Project.Persistence.Dapper
{
public abstract class DbConnection1RepositoryBase
{
public IDbConnection DbConnection { get; private set; }
public DbConnection1RepositoryBase(IDbConnectionFactory dbConnectionFactory)
{
// Now it's the time to pick the right connection string!
// Enum is used. No magic string!
this.DbConnection = dbConnectionFactory.CreateDbConnection(DatabaseConnectionName.Connection1);
}
}
}
然后,對于需要與其他連接通信的其他存儲庫,可以為它們創建一個不同的存儲庫基類。
using System.Data;
using DL.SO.Project.Domain.Repositories;
namespace DL.SO.Project.Persistence.Dapper
{
public abstract class DbConnection2RepositoryBase
{
public IDbConnection DbConnection { get; private set; }
public DbConnection2RepositoryBase(IDbConnectionFactory dbConnectionFactory)
{
this.DbConnection = dbConnectionFactory.CreateDbConnection(DatabaseConnectionName.Connection2);
}
}
}
using Dapper;
using System.Data;
namespace DL.SO.Project.Persistence.Dapper.Repositories
{
public class ParameterRepository : DbConnection2RepositoryBase, IParameterRepository
{
public ParameterRepository (IDbConnectionFactory dbConnectionFactory)
: base(dbConnectionFactory) { }
public IEnumerable GetAll()
{
const string sql = @"SELECT * FROM TABLE";
return base.DbConnection.Query(sql);
}
// ......
}
}
希望所有這些幫助。
總結
以上是生活随笔為你收集整理的dapper 连接mysql_如何在.NET中使用Dapper处理数据库连接?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java jxl 写 excel_Jav
- 下一篇: java class 结构_Java c