2017-01-23 77 views
2

TLDR:如何在我的Ninject綁定中重新使用或實例化新的Sql Connection對象? ****由於SqlConnection未初始化,第二個綁定失敗****。我假設我不能跨多個綁定共享sql連接?在多個ninject綁定中重用SqlConnection

我在這個模式一個SQL資料庫:

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

DataConnection接受一個IDbConnection並返回一個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; 
     } 
    } 
} 

我重新使用它在兩個地方中的一個我的類,這取決於通過什麼類型的參數,但sql連接是相同的

public class WidgetsProvider { 
    private readonly IRepository<Widget> _widgetsRepo; 
    private readonly IRepository<Credential> _credentialRepo; 

    public WidgetsProvider(IRepository<Widget> widgetsRepo, IRepository<Credential> credentialRepo) { 
     _widgetsRepo = widgetsRepo; 
     _credentialRepo = credentialRepo; 
    } 
} 

這裏是我的綁定:

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的一個結合,而不是實例之一:

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

我不知道這是怎麼回事,但第二個綁定過程中,我m得到一個錯誤'((System.Data.SqlClient.SqlConnection)_connection).ServerVersion'拋出了一個'System.InvalidOperationException'類型的異常。 – Kyle

+0

它可能與我需要在linq查詢中調用需要db的函數有關。在最初的幾次成功調用後,InvalidOperationException說{「ConnectionString屬性尚未初始化」}。 – Kyle

+0

Doh!這是正確的答案(接受)。另一個問題與我的'using(){}'子句處理和關閉連接有關。 – Kyle