請不要 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; }
}
以上是我的邏輯,想提出來驗證、討論哪種做法好與壞
正常來說,repository 對我來說。只是一個資料讀取的應用處理。
我的確也是認同你不該有 connection 存在。
但其實,repository 對我來說,用比較白話點的說法。則是比較偏向於sql語法組合的物件。
對我來說。為何我不會在 repository 下connection。
是因為其有繼承了對應query及db相關的模組應用。
其連線及db相關設定。其實都會放在這邊。而不會在repository內。
包含了你說的交易。也會是由 repository 來對應相關的 db類處理。
所以,我還是有一個核心用的db處理相關類。
而 repository 就好像只是單純的設計圖?或是功能器。
來幫我不需要在寫一堆sql語法的應用。
因為都在 repository 上面都寫好了。