Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于如何将Dapper与Structuremap和依赖项注入一起使用的简单但很好的示例_C#_Dependency Injection_Structuremap_Dapper - Fatal编程技术网

C# 关于如何将Dapper与Structuremap和依赖项注入一起使用的简单但很好的示例

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

我试图理解如何使用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();
        }
    }
}
我已经读到您可以使用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替换项。谢谢,将试用并返回给您抱歉,还没有时间试用,将在本周末进行,如何处理和关闭事务上下文的连接对象?