【发布时间】:2016-10-27 19:09:45
【问题描述】:
我正在尝试了解如何将依赖注入与 Dapper (IDbConnection) 一起使用,并且仍然能够使用内置的 dispose。
我在网上找到了几篇文章,但不是我认为容易理解的。
我想弄清楚的是如何让这个简单的类可测试:
public class UserProfileRepository : IUserProfileRepository
{
private readonly IConfigRepository _configRepository;
public UserProfileRepository(IConfigRepository configRepository)
{
_configRepository = configRepository;
}
public UserProfile GetUserProfile(string userId)
{
const string query = @"Select UserId, UserName
From Users
Where UserId = @UserId";
using (var conn = new SqlConnection(_configRepository.GetConnectionString("MyConnectionString")))
{
conn.Open();
return conn.Query<UserProfile>(query, new { UserId = userId }).SingleOrDefault();
}
}
}
我有一个如下所示的配置存储库,因此我可以模拟对 web.config 的请求:
public class ConfigRepository : IConfigRepository
{
public string GetConnectionString(string key)
{
var conString = ConfigurationManager.ConnectionStrings[key];
if (conString != null)
{
return conString.ConnectionString;
}
return string.Empty;
}
}
我已经读到您可以使用 ConnectionFactory,但还没有弄清楚如何实现它,但仍然知道我正在正确地处理它。
谁能指出我正确的方向?
【问题讨论】:
-
您还没有考虑其他选项。一,通过集成测试来测试这个类。第二,模拟整个存储库(因为您毕竟使用依赖注入)并放弃数据库调用。目前还不清楚您实际上要完成什么,因为您仍然直接实例化 sql 连接,使其不可模拟。
-
谢谢。是的,我刚刚开始尝试使这些存储库可测试,但要么我不擅长谷歌搜索,要么没有关于如何做到这一点的最佳实践。
-
@HenrikFransas 最佳实践基于您的要求,没有适合所有情况的标准规则。尽管如此,让我发布一个使用 Ninject 的 DI 示例,Structure Map 也应该存在类似的机制
-
我下面的答案是对另一个问题的重复,但要求或多或少相同,只有 Mocking 是额外的
标签: c# dependency-injection structuremap dapper