C# 关于如何将Dapper与Structuremap和依赖项注入一起使用的简单但很好的示例
我试图理解如何使用Dapper(IDbConnection)的依赖注入,并且仍然能够使用内置的dispose 我在网上找到了几篇文章,但我认为很容易理解 我想弄明白的是如何使这个简单的类成为可测试的:C# 关于如何将Dapper与Structuremap和依赖项注入一起使用的简单但很好的示例,c#,dependency-injection,structuremap,dapper,C#,Dependency Injection,Structuremap,Dapper,我试图理解如何使用Dapper(IDbConnection)的依赖注入,并且仍然能够使用内置的dispose 我在网上找到了几篇文章,但我认为很容易理解 我想弄明白的是如何使这个简单的类成为可测试的: public class UserProfileRepository : IUserProfileRepository { private readonly IConfigRepository _configRepository; public UserProfileReposi
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();
}
}
}
我已经读到您可以使用ConnectionFactory,但还没有弄清楚如何实现它,并且仍然知道我正在正确地处理它
有人能给我指出正确的方向吗?根据我的经验,最好的连接创建机制是
依赖注入
和连接工厂
的组合。我正在摆脱IConfigRepository
,因为这里所有的工作都是使用工厂完成的
优势是多方面的:
[Inject] // Property Injection
public IDBConnection Connection {get; set;}
Bind<IDBConnection>().ToMethod(ctx =>
ConnectionFactory.CreateDbConnection("DefaultConnection"));
- 在运行时在事务或线程范围内创建连接对象
- 在运行时更改数据提供程序,从而更改系统的数据库(使用连接工厂)
[Inject] // Property Injection
public IDBConnection Connection {get; set;}
Bind<IDBConnection>().ToMethod(ctx =>
ConnectionFactory.CreateDbConnection("DefaultConnection"));
在数据访问层中声明IDBConnection
对象:
[Inject] // Property Injection
public IDBConnection Connection {get; set;}
Bind<IDBConnection>().ToMethod(ctx =>
ConnectionFactory.CreateDbConnection("DefaultConnection"));
使用像Ninject这样的DI框架声明绑定:
[Inject] // Property Injection
public IDBConnection Connection {get; set;}
Bind<IDBConnection>().ToMethod(ctx =>
ConnectionFactory.CreateDbConnection("DefaultConnection"));
如何使用它:
[Inject] // Property Injection
public IDBConnection Connection {get; set;}
Bind<IDBConnection>().ToMethod(ctx =>
ConnectionFactory.CreateDbConnection("DefaultConnection"));
只需一个电话就可以处理
对于事务上下文,按原样使用,不使用
必需
关于嘲弄:
[Inject] // Property Injection
public IDBConnection Connection {get; set;}
Bind<IDBConnection>().ToMethod(ctx =>
ConnectionFactory.CreateDbConnection("DefaultConnection"));
无论使用哪种模拟框架进行单元测试,您都必须模拟
UserProfileRepository::GetUserProfile(stringuserid)
的结果,这将比使用依赖项注入填充MockConnection
更容易,因为依赖项注入会使其变得复杂。DI适用于实际用例,用于在运行时填充连接对象还有其他您没有考虑的选项。第一,通过集成测试来测试这个类。第二,模拟整个存储库(因为您毕竟使用的是依赖项注入),并放弃数据库调用。由于您仍然直接实例化sql连接,使其不可修改,因此不清楚您实际想要实现什么。谢谢。是的,我刚刚开始尝试使这些存储库可测试,但不是我不擅长谷歌搜索,就是没有关于如何进行测试的最佳实践。@HenrikTransas最佳实践基于您的要求,没有适用于所有情况的标准规则。尽管如此,让我发布一个使用Ninject的DI示例,类似的机制应该存在于结构图中,我下面的答案是另一个问题的重复,但要求或多或少是相同的,只是嘲笑是额外的谢谢,我会尝试一下。这会使它根据请求正确地进行处置吗?或者它使用什么作用域?在池启用模式下,关闭/处置将连接对象发送回池,而不是销毁它。异议的创建和处置始终是针对每个请求的,但您可以使用依赖项注入调用/绑定使作用域事务基于此。我的代码是与Ninject一起编写的,请确保找到StructureMap替换项。谢谢,将试用并返回给您抱歉,还没有时间试用,将在本周末进行,如何处理和关闭事务上下文的连接对象?