日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

dapper 连接mysql_如何在.NET中使用Dapper处理数据库连接?

發布時間:2024/9/15 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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处理数据库连接?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。