我需要为我的Web API服务设计数据层的指导。 Web API控制器调用调用数据层的服务层。
我打算与Dapper一起使用Entity Framework。将它们一起使用可能不是一个好的解决方案,但我需要两者。我需要EF,因为它更容易使用,我的团队中的开发人员也很熟悉。我需要Dapper来提高性能。因此,它将取决于短小精悍者可以产生重大影响的位置以及我们可以在晚些时候妥协的地方。
使用EF时,我想为每个实体使用存储库的工作单元。我的存储库就像
public class StudentRepository : IStudentRepository, IDisposable
{
private SchoolContext context;
public StudentRepository(SchoolContext context)
{
this.context = context;
}
public IEnumerable<Student> GetStudents()
{
return context.Students.ToList();
}
}
获取了示例代码
所以,现在我想介绍Dapper。
方法1:最初我想过为Dapper和Entity Framework提供多个存储库,我可以在依赖注入容器中注册我需要的存储库。但在这种情况下,来自IStudentRepository
接口的所有方法都需要在EF和Dapper具体的存储库类中实现(如果我可以完全在Dapper中执行此操作,那么我根本不需要EF)。 / p>
方法2:然后我考虑了一种更丑陋的方法,就像在IDbConnection
中展示DbContext
属性以及SchoolContext
属性(在本例中为StudentRepository
){ {1}}课程。
所以这个例子就像
public class StudentRepository : IStudentRepository, IDisposable
{
private SchoolContext context;
private IDbConnection Db;
public StudentRepository(SchoolContext context)
{
this.context = context;
this.db = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
}
public IEnumerable<Student> GetStudents()
{
return context.Students.ToList();
}
public IEnumerable<Student> GetStudentsBasedOnSomeComplexCondition()
{
//I can use the db property here and work with dapper in this case.
}
(包含IDbConnection
属性可以通过抽象类完成,以便不重复此属性的实例化代码,并在需要时轻松更改连接字符串。我将其添加到为了简单起见同一类。)
方法3:现在,我想进一步将它分开,我再次认为这是一种丑陋的方式。除了StudentRepository
只有EF的东西(比如第一个例子),我还有另一个名为StudentDapperRepository
的具体类,它继承自StudentRepository
。
StudentRepository
中的所有方法都将更改为virtual
。所以,我将StudentDapperRepository
用于我的实际数据层,这将在需要的地方使用Dapper实现,在不需要的地方,它将使用基类StudentRepository
方法(在EF中)。 / p>
我认为我的所有解决方案都很丑陋并且增加了更多的复杂性和混乱。那么,我能否了解如何做到这一点。