iT邦幫忙

0

請不要 repository 建立 connection?

c#
  • 分享至 

  • twitterImage

請不要 repository 建立 connection?

看了幾個專案、網路上案例的 repository,喜歡在方法內建立 connection
像是圖片: https://i.imgur.com/GZXo4XD.png

public async Task<Author> GetByID(int id)
{
    using (IDbConnection conn = new SqlConnection(_config.GetConnectionString("IDGDbConnectionString")))
    {
        string query = "SELECT Id, FirstName, LastName,Address FROM Author WHERE Id = @id";
        conn.Open();
        var result = await conn.QueryAsync<Author>(
        query, new { Id = id });
        return result.FirstOrDefault();
    }
}

connection的管理我覺得應該要多設一個參數做管理才對,這樣才能做 transation 跟連線管理

public async Task<Author> GetByID(IDbConnection conn,int id)
{
    string query = "SELECT Id, FirstName, LastName,Address FROM Author WHERE Id = @id";
    var result = await conn.QueryAsync<Author>(
    query, new { Id = id });
    return result.FirstOrDefault();
}

或是更進一步作法,在 constructor 傳入 connection 概念如下

public class Program
{
	public static async Task Main(string[] args)
	{
		using (var cnn = new SqlConnection(""))
		{
			using (var authorRepository = new AuthorRepository(cnn))
			{
				var author = await authorRepository.GetByID(123456);
			}
		}
	}
}

public class AuthorRepository : IDisposable
{
	private readonly IDbConnection _conn;
	private bool disposedValue;

	public AuthorRepository(IDbConnection conn) => this._conn = conn;

	public async Task<Author> GetByID(int id)
	{
		string query = "SELECT Id, FirstName, LastName,Address FROM Author WHERE Id = @id";
		var result = await _conn.QueryAsync<Author>(
		query, new { Id = id });
		return result.FirstOrDefault();
	}

	protected virtual void Dispose(bool disposing)
	{
		if (!disposedValue)
		{
			if (disposing)
			{
				// TODO: dispose managed state (managed objects)
			}

			// TODO: free unmanaged resources (unmanaged objects) and override finalizer
			// TODO: set large fields to null
			disposedValue = true;
		}
	}

	public void Dispose()
	{
		// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
		Dispose(disposing: true);
		GC.SuppressFinalize(this);
	}
}

public class Author
{
	public int Id { get; set; }
	public string FirstName { get; set; }
	public string LastName { get; set; }
	public string Address { get; set; }
}

以上是我的邏輯,想提出來驗證、討論哪種做法好與壞

看更多先前的討論...收起先前的討論...
如果是想教學的話,或許你發到「技術文章」內會比較好喔。

因為看來你也不是在討論或是問問題。
正一 iT邦新手 5 級 ‧ 2020-12-18 11:44:30 檢舉
您好,這篇想藉由先提出我的作法
來討論是否有更好作法
> 在 constructor 傳入 connection
推這個做法,這其實就是 DI (依賴注入) 框架的邏輯
那好,我下面說說我的看法給你。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2020-12-18 13:17:02
最佳解答

正常來說,repository 對我來說。只是一個資料讀取的應用處理。
我的確也是認同你不該有 connection 存在。

但其實,repository 對我來說,用比較白話點的說法。則是比較偏向於sql語法組合的物件。
對我來說。為何我不會在 repository 下connection。
是因為其有繼承了對應query及db相關的模組應用。

其連線及db相關設定。其實都會放在這邊。而不會在repository內。
包含了你說的交易。也會是由 repository 來對應相關的 db類處理。

所以,我還是有一個核心用的db處理相關類。
而 repository 就好像只是單純的設計圖?或是功能器。
來幫我不需要在寫一堆sql語法的應用。
因為都在 repository 上面都寫好了。

正一 iT邦新手 5 級 ‧ 2020-12-18 13:57:05 檢舉

感謝分享寶貴經驗!

lusaka216 iT邦新手 4 級 ‧ 2020-12-21 17:30:15 檢舉

您好浩瀚星空大大,因為自己對這個部分陌生,不知道大大能否舉一個例子說明

我要發表回答

立即登入回答