4

在 MVC 3 项目中,我使用 EF4、IoC 和 Agatha-RRSL 作为我的服务层。

幸运的是,这周我找到了 Dapper,我正在从 EF4 迁移到 Dapper!

通常我在我的 Agatha 请求处理程序中注入一个通用存储库......

但是我应该如何使用 Dapper?

1) 我应该在 Agatha 处理程序中注入一个 IDbConnection 吗?然后在处理程序中我将它与 Dapper Query 或 Dapper Execute 一起使用?这是可测试的吗?嘲笑呢?

2) 我应该为 Dapper 创建一个通用存储库吗?也许存储库会是这样的:

public class Repository {

  private IDbConnection _connection;

  public Repository(IDbConnection connection) {
    _connection = connection;
  } // Repository

  public Int32 Execute(String sql, dynamic param = null) {
    return _connection.Execute(sql, param); 
  } // Execute

  // Query code   
}

IDbConnection 将被注入这里。

并且存储库将被注入到处理程序中。

不知道如何测试这个......

3)我应该把我所有的代码都放在处理程序中吗?

using (SqlConnection connection = new SqlConnection(connectionString)) {
 connection.Execute(@"insert Roles(Name) values (@name)", new { name = "Role" }); 
}

但是测试呢?

4)我已经意识到 Dapper 使用静态方法。这不会引起一些记忆问题吗?

抱歉有这么多问题......我正在努力解决这个问题。

谢谢你,米格尔

4

1 回答 1

0

迟到的答案,但我想指出您的存储库实现实际上是一个“数据访问对象”。存储库处理整个聚合,即。一组属于一起的事物。理想情况下,您的接口应该只接受和返回聚合根类型的对象(例如, aRepository<User>可能有方法void Update(User user) {}IEnumerable<User> Find(...) {})。

任何持久性机制的使用或存在都是一个实现细节,通常不属于存储库接口,也不会说 SQL。

于 2012-10-08T15:36:19.087 回答