這可能更多的代碼審查問題,而不是堆棧溢出。存儲庫設計模式與Dapper
我正在使用DAPPER進行MicroORM檢索並將數據保存到SQL Server 2014.我已經在DTO Proj中獲得了代表從數據庫中檢索到的數據或保存到數據庫的DTO類。
我使用存儲庫模式,以便在我的業務層是否需要一個倉庫,我使用構造DI來注入依賴,然後調用的庫的方法做的工作。
所以說我有2個服務叫做CustomerService和CarService。
然後我有2個存儲庫一個CustomerRepository和一個CarRepository。
我有限定在每個存儲庫中的所有方法,然後將具體實現的接口。
的示例性方法如下所示(調用一個存儲過程做DB INSERT(注意,存儲的過程的實際字符串變量在類的頂部被定義爲私有字符串):
public void SaveCustomer(CustomerDTO custDTO)
{
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
{
db.Execute(saveCustSp, custDTO, commandType: CommandType.StoredProcedure);
}
}
這一切工作正常,但我發現自己在每一個存儲庫中每個方法重複使用的塊。我有下面列出兩個真正的問題。
有沒有更好的辦法,我可以使用或許在某種程度上使用BaseRepository類每個其他Repository從中繼承,Base將實現數據庫連接的實例化?
對於系統上的多個併發用戶,這仍然可以正常工作嗎?
**** ****更新
基於西拉答案我已經創建瞭如下
public interface IBaseRepository
{
void Execute(Action<IDbConnection> query);
}
public class BaseRepository: IBaseRepository
{
public void Execute(Action<IDbConnection> query)
{
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
{
query.Invoke(db);
}
}
}
然而,在我的倉庫,我還有其他的方法,如下面的:
public bool IsOnlyCarInStock(int carId, int year)
{
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
{
var car = db.ExecuteScalar<int>(anotherStoredSp, new { CarID = carId, Year = year },
commandType: CommandType.StoredProcedure);
return car > 0 ? true : false;
}
}
和
public IEnumerable<EmployeeDTO> GetEmployeeDetails(int employeeId)
{
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
{
return db.Query<EmployeeDTO>(anotherSp, new { EmployeeID = employeeId },
commandType: CommandType.StoredProcedure);
}
}
什麼是使用通用類型T將這些添加到我的基本存儲庫的正確方法,所以我可以返回任何類型的DTO或任何C#本機類型
這是爲了實現它,你需要讓你的BaseRepository一次性處置您的IDbConnection的方式。您可以在Microsoft文檔中查看有關使用存儲庫模式和工作單元模式的信息https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef- 5-using-mvc-4 /實現存儲庫和工作單元模式-asp-net-mvc-application – OrcusZ
「使用」塊是一個必要的邪惡,因爲你打開連接到需要關閉的數據庫。所以重複是必要的。我只會建議不要陷入整個資源庫設計模式的東西.... –
@Callum - 你會提出什麼樣的模式,或者你可以用一個例子來說明。我曾看過使用CQRS,但我覺得庫如上所述基於KISS –