C# 在多个ninject绑定中重用SqlConnection
TLDR:如何在Ninject绑定中重新使用或实例化新的Sql连接对象****由于SqlConnection未初始化,第二个绑定失败****。我假设我不能跨多个绑定共享sql连接 我有一个采用这种模式的Sql存储库:C# 在多个ninject绑定中重用SqlConnection,c#,sql,dependency-injection,ninject,sqlconnection,C#,Sql,Dependency Injection,Ninject,Sqlconnection,TLDR:如何在Ninject绑定中重新使用或实例化新的Sql连接对象****由于SqlConnection未初始化,第二个绑定失败****。我假设我不能跨多个绑定共享sql连接 我有一个采用这种模式的Sql存储库: public class SqlRepository<T> : DataConnection, IRepository<T> where T : new() { public SqlRepository(IDbConnection connectio
public class SqlRepository<T> : DataConnection, IRepository<T> where T : new() {
public SqlRepository(IDbConnection connection) : base(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;
}
}
公共类WidgetsProvider{
私人只读IRepository\u widgetsRepo;
私人只读电子存款凭证回购;
公共WidgetsProvider(IRepository widgetsRepo、IRepository 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);
}
}
公共类WidgetIocModule:Ninject.Modules.Ninject模块{
公共覆盖无效负载(){
//获取sql连接
var sql=new-SqlConnection(ConfigurationManager.ConnectionStrings[“widgetsConn”].ToString());
//绑定回购协议
使用构造函数参数(“连接”,sql)将()绑定到().InSingletonScope();
使用构造函数参数(“连接”,sql)将()绑定到().InSingletonScope();
}
}
为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>());
Bind().ToConstant(新的SqlConnection(ConfigurationManager.ConnectionStrings[“widgetsConn”].ToString());
Bind().To().InSingletonScope().WithConstructorArgument(“connection”,context=>Kernel.Get());
Bind().To().InSingletonScope().WithConstructorArgument(“connection”,context=>Kernel.Get());
我不确定发生了什么,但在第二次绑定期间,我收到了一个错误”((System.Data.SqlClient.SqlConnection)\u connection)。ServerVersion“引发了类型为“System.InvalidOperationException”的异常
。这可能与我调用需要linq查询中的db的函数有关。invalidoOperationException
在前几次成功调用后,显示{“ConnectionString属性尚未初始化。”}。Doh!这是正确答案(已接受)。另一个问题与我的using(){}
子句处理和关闭连接有关。
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>());