我想使用DbConnection
将SqlConnection
映射到未打开的Ninject
。这就是我所做的:
string constr = @"Server=.\SQLEXPRESS; Trusted_Connection=True; Database=TestDB";
Bind<DbConnection>().To<SqlConnection>()
.Using<OnePerRequestBehavior>()
.WithConstructorArgument("connectionString", constr);
但是,在尝试使用db时,我收到错误消息
此操作需要连接到“master”数据库。无法创建与“主”数据库的连接,因为已打开原始数据库连接并且已从连接字符串中删除凭据。提供未打开的连接。
(如果我只提供与new SqlConnection(constr)
的连接,则相同的操作...)
事实证明 Ninject给出的QueryString
SqlConnection
属性是空的。我做错了什么?
更新
我现在已经在绑定后直接使用kernel.Get<DbConnection>()
进行了测试,并且使用上面的代码它仍然给我一个空的连接字符串。以下是有效的,虽然它比我想要的更冗长:
Bind<DbConnection>().ToMethod<SqlConnection>(ctx => GetConnection());
private SqlConnection GetConnection()
{ return new SqlConnection(constr); }
更新2
这是我的整个模块:
public class MsSqlModule : StandardModule
{
private string constr = @"Server=AASLOEG\SQLEXPRESS; Trusted_Connection=True; Database=Booking_Test";// System.Configuration.ConfigurationManager.ConnectionStrings["mssql"].ConnectionString;
public override void Load()
{
Bind<DbConnection>().To<SqlConnection>().WithConstructorArgument("connectionString", constr);
var test = Kernel.Get<DbConnection>();
test.Dispose();
}
}
在var test = Kernel.Get<DbConnection>();
上有一个断点并且单步执行,我看到test
填充了SqlConnection
,但ConnectionString
属性为空。
答案 0 :(得分:0)
你所拥有的代码似乎很好,如果你要DBConnection
,Ninject应该大声使用绑定或comnplain。
你确定ImplicitSelfBinding
没有踩到吗?你可以在Module
关掉它吗? (但你需要注入一个SqlConnection
才能实现)。
如果您在Get<DBConnection>()
行之后立即执行Bind
会怎样?
答案 1 :(得分:0)
我最终通过创建自定义提供程序并绑定到它来解决此问题。 (我也升级到Ninject 2.0,这可能会影响结果......)
public class MsSqlConnectionProvider : DbConnectionProvider<SqlConnection>
{
public string ConnectionString { get { return TestConnectionString; } }
public string ConnectionStringFromConfigFile { get { return System.Configuration.ConfigurationManager.ConnectionStrings["mssql"].ConnectionString; } }
public string TestConnectionString { get { return @"Server=AASLOEG\SQLEXPRESS; Trusted_Connection=True; Database=Booking_Test"; } }
protected override SqlConnection CreateInstance(IContext context)
{
return new SqlConnection(ConnectionString);
}
}
public class MsSqlModule : NinjectModule
{
public override void Load()
{
Bind<DbConnection>().ToProvider<MsSqlConnectionProvider>();
}
}
答案 2 :(得分:0)