我正在使用Dapper作为MicroORM,用于检索和保存数据到SQL Server 2014。我有DTO类在DTO Proj中,它们表示从数据库检索的数据或保存到数据库中的数据。
我正在使用存储库模式,因此在我的服务层中,如果需要存储库,则使用构造函数DI来注入该依赖项,然后调用存储库上的方法来完成工作。
假设我有两个名为CustomerService和CarService的服务。
然后我有两个存储库,一个是CustomerRepository,另一个是CarRepository。
我有一个接口定义了每个存储库中的所有方法,然后是具体实现。
下面显示了一个示例方法(调用存储过程执行DB INSERT(请注意,存储过程的实际字符串变量在类的顶部定义为私有字符串):
这一切都很好,但我发现在每个存储库的每个方法中都要重复使用using块。我有以下两个真正的问题。
1. 是否有更好的方法可以使用,可能是通过使用每个其他存储库都继承自的BaseRepository类,并且Base将实现DB连接的实例化?
2. 对于系统上的多个并发用户,这是否仍然有效?
基于Silas的答案,我创建了以下内容:
我正在使用存储库模式,因此在我的服务层中,如果需要存储库,则使用构造函数DI来注入该依赖项,然后调用存储库上的方法来完成工作。
假设我有两个名为CustomerService和CarService的服务。
然后我有两个存储库,一个是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);
}
}
这一切都很好,但我发现在每个存储库的每个方法中都要重复使用using块。我有以下两个真正的问题。
1. 是否有更好的方法可以使用,可能是通过使用每个其他存储库都继承自的BaseRepository类,并且Base将实现DB连接的实例化?
2. 对于系统上的多个并发用户,这是否仍然有效?
基于Silas的答案,我创建了以下内容:
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#本机类型。