Ninject:请求DbConnection时提供未打开的SqlConnection

时间:2010-01-31 22:46:41

标签: mapping database-connection ninject sql-server-2008-express

我想使用DbConnectionSqlConnection映射到未打开的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属性为空。

3 个答案:

答案 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)

有点晚了,但是......

following博客上找到了这个。

只需添加:

  

坚持安全信息=真

...到您的连接字符串。为我工作。