这可能更多的代码审查问题,而不是堆栈溢出。存储库设计模式与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 –