2017-01-23 41 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