IDbConnection和StructureMap的问题

时间:2011-08-01 19:10:06

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

我在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;
}

在我的一个服务例程中,我正在调用一个方法来获取我的存储库中的对象,然后在返回服务层时,我在我的存储库中调用第二个方法 - 但是,在第二次调用存储库时,我的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依赖项仍应保留原始连接字符串的详细信息。

有人可以说明我出错的地方吗?

1 个答案:

答案 0 :(得分:2)

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

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