首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlClient连接工厂管理,包含一个WCF服务中的项目

SqlClient连接工厂管理,包含一个WCF服务中的项目
EN

Stack Overflow用户
提问于 2012-07-07 20:15:48
回答 1查看 1.1K关注 0票数 1

我在我的WCF服务中遇到了这个问题。“在从池中获取连接之前超时时间已过”

现在我理解了这个错误,我的问题是,使用Ninject管理WCF服务中的Sql连接的正确方法是什么。

我所做的是这样的。在绑定中,我有

代码语言:javascript
复制
 Bind<IConnectionFactory>().To<ConnectionFactory>().InScope(c => OperationContext.Current);

我的连接工厂看起来像这样。

代码语言:javascript
复制
public class ConnectionFactory : IConnectionFactory
{
    private string connectionString = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;
    private SqlConnection sqlConnection;

    public SqlConnection GetOpenConnection()
    {
        if (sqlConnection == null)
            sqlConnection = new SqlConnection(connectionString);

        if (sqlConnection.State != ConnectionState.Open)
            sqlConnection.Open();

        return sqlConnection;
    }

    public void CloseConnection()
    {
        sqlConnection.Close();
    }

每当我需要一个Sql连接时,我都会通过一个IoC容器调用它,如下所示。

代码语言:javascript
复制
 SqlConnection connection = IoC.Resolve<IConnectionFactory>().GetOpenConnection();

我的假设是,每当我处理相同的请求时,我都会从Ninject获得相同的连接,并且该请求生命周期内的所有连接调用都将获得相同的连接。基于这个错误,我假设这不会发生。有没有更好的方法来做这件事?或者,对于使用ninject的WCF来说,更好的连接管理范例是什么?我觉得让连接工厂成为单例是错误的,但这只是我的直觉。

编辑:我想添加我将连接注入到我的存储库,如下所示

代码语言:javascript
复制
private readonly SqlConnection connection;

    public RandomRepository(IConnectionFactory connectionFactory)
    {
        connection = connectionFactory.GetOpenConnection();
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-08 23:30:58

嘿,你可以安装Ninject.Extensions.WCF,这为你提供了合适的服务范围。然后,您可以直接将SqlConnection注入到您的类中,而不必使用连接工厂。只需使用具有适当作用域的方法绑定。例如,使用call作用域:

代码语言:javascript
复制
Bind<ISqlConnection>().ToMethod(ctx => ctx.Kernel.Get<IConnectionFactory>().GetOpenConnection()).InCallScope();

然后,当你的请求超出作用域时,Ninject会处理掉这个连接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11374918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档