SqlClient连接工厂管理,在WCF服务中使用ninject

时间:2012-07-07 12:15:48

标签: c# wcf ninject

我目前在我的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获得相同的连接,并且该请求生命周期内的所有连接调用都将获得相同的连接。根据错误,我假设这没有发生。有没有更好的方法呢?或者什么是更好的连接管理范例WCF与ninject?我认为将连接工厂变成单身是错误的方法,但这只是我的直觉。

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

private readonly SqlConnection connection;

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

1 个答案:

答案 0 :(得分:0)

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

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

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