1

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

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

我所做的就是这个。在绑定中我有

 Bind<IConnectionFactory>().To<ConnectionFactory>().InScope(c => OperationContext.Current);

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

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 容器调用它。

 SqlConnection connection = IoC.Resolve<IConnectionFactory>().GetOpenConnection();

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

编辑:我想补充一点,我将连接注入到我的存储库中,就像这样

private readonly SqlConnection connection;

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

1 回答 1

0

嗨,您可以安装 Ninject.Extensions.WCF 这为您提供了适当的 WCF 服务范围。然后,您可以SqlConnection直接将一个注入到您的类中,而无需使用您的连接工厂。只需使用具有适当范围的方法绑定即可。例如调用范围:

Bind<ISqlConnection>().ToMethod(ctx => ctx.Kernel.Get<IConnectionFactory>().GetOpenConnection()).InCallScope();

然后,当您的请求超出范围时,Ninject 将负责处理连接。

于 2012-07-08T15:30:58.487 回答