2017-01-23 13 views
2

TLDR:Ninjectバインディングで新しいSql Connectionオブジェクトを再利用またはインスタンス化するにはどうすればよいですか? **** SqlConnectionが初期化されていないため、2番目のバインディングが****に失敗しています。私は複数のバインディングを介してSQL接続を共有できないと思いますか?複数のninjectバインディングでSqlConnectionを再利用する

私はこのパターンでSQLのリポジトリを持っています。

public class SqlRepository<T> : DataConnection, IRepository<T> where T : new() { 
    public SqlRepository(IDbConnection connection) : base(connection) 
} 

DataConnectionIDbConnectionを受け入れ、Connectionオブジェクトを返します。

public class DataConnection : IDisposable { 
    private IDbConnection _connection; 

    public DataConnection(IDbConnection connection) { 
     this._connection = connection; 
    } 

    protected IDbConnection Connection { 
     get { 
      if(_connection.state != ConnectionState.Open && _connection.state != ConnectionState.Connecting) 
       _connection.Open(); 

      return _connection; 
     } 
    } 
} 

Iのいずれかで2つの場所でそれを再使用しています私のクラスは、どの型引数が渡されるかによって異なりますが、のSQL接続は同じです

ここ

は私のバインディングです:

public class WidgetIocModule : Ninject.Modules.NinjectModule { 
    public override void Load() { 
     //get the sql connection 
     var sql = new SqlConnection(ConfigurationManager.ConnectionStrings["widgetsConn"].ToString()); 

     //bind to repos 
     Bind<IRepository<Widget>>().To<SqlRepository<Widget>>().InSingletonScope().WithConstructorArgument("connection", sql); 
     Bind<IRepository<Credential>>().To<SqlRepository<Credential>>().InSingletonScope().WithConstructorArgument("connection", sql); 
    } 
} 

答えて

2

は、あなたのSqlConnectionのための結合ではなく、1をインスタンスを作成します。

Bind<SqlConnection>().ToConstant(new SqlConnection(ConfigurationManager.ConnectionStrings["widgetsConn"].ToString())); 

Bind<IRepository<Widget>>().To<SqlRepository<Widget>>().InSingletonScope().WithConstructorArgument("connection", context => Kernel.Get<SqlConnection>()); 
Bind<IRepository<Credential>>().To<SqlRepository<Credential>>().InSingletonScope().WithConstructorArgument("connection", context => Kernel.Get<SqlConnection>()); 
+0

私は何が起こっているのかわからないんだけど、2番目のバインド時に、私は」エラー( '(System.Data.SqlClient.SqlConnection)_connection).ServerVersion'が 'System.InvalidOperationException'型の例外をスローしました。 – Kyle

+0

linqクエリの中でdbを必要とする関数を呼び出すのは私と関係があります。 'InvalidOperationException'は、{ConnectionStringプロパティが初期化されていません。}}最初のいくつかの成功した呼び出しの後に}}。 – Kyle

+0

Doh!これは正解です(受け入れられました)。もう一つの問題は私の 'using(){}'節に関連しています。 – Kyle

関連する問題