4

注入连接字符串与实例的权衡是IDbConnection什么?

我使用 StructureMap 将各种服务注入到我的 ASP.NET MVC 应用程序中,其中大部分都需要数据库访问以进行 LINQ-to-SQL 查询。为 IoC注入一个IDbConnection似乎比通用连接字符串using参数更可测试和更容易配置,但如果我没有明确地将连接包装在一个块中,我担心打开的连接会挂起。

我应该注意什么连接池的优点或缺点?

注入的连接字符串

using (var con = new SqlConnection(InjectedConnectionString))
{
    con.Execute("INSERT INTO Logs (...) VALUES (...)");
    using (var db = new MyDataContext(con))
    {
        var records = from p in db.Products
                      select p;
    }
}

注入的 IDbConnection

con.Execute("INSERT INTO Logs (...) VALUES (...)");
using (var db = new MyDataContext(InjectedConnection))
{
    var records = from p in db.Products
                  select p;
}
4

1 回答 1

3

任何中等复杂的 IoC 容器(结构图)的一个特性是能够控制对象的生命周期。默认情况下,结构映射使用瞬态生命周期。这意味着它为每个对象图创建一个新实例。在实践中,这通常与 per-web-request 相同(除非您在代码中使用 的用法container.GetInstance<T>())。

通过使用结构映射注入数据库连接等宝贵资源,您可以控制它们的生存时间。单个资源可以(如果您选择)在整个 Web 请求中重复使用,或者为每次使用重新创建。

此外,这些选择(以及配置)现在已外部化到注册表中,而不是通过代码散布它们。如果您必须更改连接的创建方式,您只需查看一处。具有单一职责的类始终是首选。

就您的连接池而言,任何 IoC 容器都不会涉及连接池等细节。然而,它们确实对生命有帮助。Structuremap 将调用Dispose()任何IDisposable对象(嗯,实际上是调用它的解释器)。

编辑:再次在连接池中,每个生命周期都有自己的规则来处理对象的处理方式和时间。Transient 依赖于 CLR 来处理,但是HttpRequestScoped在每个请求结束时确定性地处理对象。使用HttpRequestScoped会阻止您最大化连接数。

于 2012-08-25T14:23:10.827 回答