【问题标题】:Problem with IDbConnection and StructureMapIDbConnection 和 StructureMap 的问题
【发布时间】:2011-10-17 16:53:11
【问题描述】:

我在 IContainer Initialize 例程中配置了以下内容:

x.For<IDbConnection>().Use<SqlConnection>().Ctor<string>().Is(MY_SQL_CONNECTION_STRING);

这是我的服务的构造函数:

private readonly IForumRepository _repo;
public ForumService(IForumRepository repo)
{
    _repo = repo;
}

这是我的存储库的构造函数:

private readonly IDbConnection _cn;
public ForumRepository(IDbConnection connection)
{
    _cn = connection;
}

在我的一个服务例程中,我正在调用一个方法来获取我的存储库中的一个对象,然后在返回到服务层时我在我的存储库中调用第二个方法 - 但是,在第二次调用存储库时,我的连接 (_cn) 不再有与之关联的连接字符串(当我的服务第一次调用存储库中的方法时,它似乎在退出 using {} 块时被擦除。

这是我在存储库中调用的第一个方法。

public Tag GetTag(int id)
{
    Tag o;
    const string q = @"select * from tags where id = @pId";

    using (_cn)
    {
        _cn.Open();
        o = _cn.Query<Tag>(q, new { pId = id }).SingleOrDefault();
    } *** AT THIS POINT THE CONN STRING PROPERTY OF _CN IS CLEARED?!

    return o;
}

我认为这应该可以正常工作,因为我的服务的构造函数实例化了一个 SQL 连接,对 repo 的第一次调用可以很好地利用它,并且看到对我的 repo 的后续调用在同一个服务范围内以为仓库的 SqlConnection 依赖应该还是保留原来的连接字符串细节。

有人可以说明我在哪里出错了吗?

【问题讨论】:

    标签: asp.net asp.net-mvc-3 dependency-injection ioc-container structuremap


    【解决方案1】:

    using 块完成后,正在使用的对象将被释放。连接字符串是否在处置时被删除?在任何情况下,您都可能不应该在 is 被释放后使用该对象。

    根据您帖子中的代码,我认为您不想使用 using 块?不过,我认为您会想要手动关闭连接(我认为 using 会作为处置的一部分自动执行此操作)。

    【讨论】:

    • 是的,连接字符串在处理时会被删除。我认为这在我的每个数据访问方法中都是很好的做法,用“使用”包装数据库调用,但在这种情况下,它看起来不起作用,因为实例化我的存储库时创建的 IDbConnection 基本上没有在 repos 中调用 1 个例程后好吗?!
    • 当您专门为块创建对象时,通常会使用 using 块。它确保在您完成后妥善处理。只要你想继续访问一个对象,你就不想释放它,所以避免使用 using 块。无论如何,重新使用连接可能不是最好的主意——我已经有一段时间没有手动编码了,但你可能想研究一下。
    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2012-04-08
    相关资源
    最近更新 更多