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 に答える