【问题标题】:Dapper. IoC, Testing and Agatha小巧玲珑。 IoC、测试和阿加莎
【发布时间】:2012-04-08 12:37:06
【问题描述】:

在一个 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 使用静态方法。 这不会引起一些内存问题吗?

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

谢谢你, 米格尔

【问题讨论】:

  • 对于插入记录,您可能还想查看 Dapper-Rainbow。 (在 NuGet 上可用)。 PS: 3) - dapper 需要一个开放的连接。
  • 是的,我刚刚找到了 Dapper-Rainbow ...但我正在考虑在 3 中打破该代码:保存连接的数据库、事务的会话和方法的存储库。你怎么看?我认为它更适合测试。你怎么看?我将在这里发布我的代码...

标签: testing inversion-of-control dapper agatha-rrsl


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2019-11-10
    相关资源
    最近更新 更多