目前礙於環境,沒有使用 .net core 開發,使用 .net framework 4.6,所以在一些容器化的配置上就要自己手動建置,也記錄一下當遇到多組連線字串要設定時的幾個解決方式。
以下提供兩種方法,第一種是最基本的自定義連線的字串名稱,第二種是使用介面繼承,會推薦第二種,詳見如下。
方法一: 自定義連線的字串名稱
var builder = new ContainerBuilder();
// 定義連線字符串
string connectionString1 = "...";
string connectionString2 = "...";
// 註冊不同的SqlConnection實例
builder.Register(c => new SqlConnection(connectionString1))
.Named<IDbConnection>("DBConnection1")
.InstancePerLifetimeScope();
builder.Register(c => new SqlConnection(connectionString2))
.Named<IDbConnection>("DBConnection2")
.InstancePerLifetimeScope();
// ...其他註冊
// 現在在需要使用這些連線的地方,您可以使用ResolveNamed來獲取正確的實例
public class YourService
{
private readonly IDbConnection _connection1;
private readonly IDbConnection _connection2;
public YourService(IComponentContext context)
{
_connection1 = context.ResolveNamed<IDbConnection>("DBConnection1");
_connection2 = context.ResolveNamed<IDbConnection>("DBConnection2");
}
// 使用 _connection1 和 _connection2...
}
方法二: 使用介面繼承
public interface IFirstDbConnection : IDbConnection { }
public interface ISecondDbConnection : IDbConnection { }
var builder = new ContainerBuilder();
// 註冊第一個數據庫連線
builder.Register(c => new SqlConnection("FirstConnectionString"))
.As<IFirstDbConnection>()
.InstancePerLifetimeScope();
// 註冊第二個數據庫連線
builder.Register(c => new SqlConnection("SecondConnectionString"))
.As<ISecondDbConnection>()
.InstancePerLifetimeScope();
// 使用時
public class YourService
{
private readonly IFirstDbConnection _firstConnection;
private readonly ISecondDbConnection _secondConnection;
public YourService(IFirstDbConnection firstConnection, ISecondDbConnection secondConnection)
{
_firstConnection = firstConnection;
_secondConnection = secondConnection;
}
// 使用 _firstConnection 和 _secondConnection...
}
使用繼承 IDbConnection 創建特定的介面為每個數據庫連線提供一個清晰和專門的抽象,這是一種很好的做法。
這種方法提供了以下幾種優點:
- 更高的靈活性,使您能夠在不同的數據庫之間更清楚地區分。
- 同時還允許您在未來更容易地進行變更或擴展。
- 此外,它避免了使用字符串來解析依賴項,這可以減少錯誤並提高代碼的可讀性和安全性。