2

我想映射DbConnection到未打开的SqlConnection使用Ninject. 这就是我所做的:

string constr = @"Server=.\SQLEXPRESS; Trusted_Connection=True; Database=TestDB";

Bind<DbConnection>().To<SqlConnection>()
    .Using<OnePerRequestBehavior>()
    .WithConstructorArgument("connectionString", constr);

但是,当尝试使用数据库时,我收到一条错误消息

此操作需要连接到“主”数据库。无法创建到“主”数据库的连接,因为原始数据库连接已打开并且凭据已从连接字符串中删除。提供一个未打开的连接。

(如果我只提供与new SqlConnection(constr)...的连接,同样的操作也有效)

原来Ninject 给出的 IQueryString属性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属性是空的。

4

3 回答 3

0

您拥有的代码看起来不错,如果您要求DBConnection.

你确定这ImplicitSelfBinding不是介入?你能把它关掉Module吗?(但您需要注入 aSqlConnection才能发生这种情况)。

如果你在你的线路Get<DBConnection>()之后立即执行会发生什么?Bind

于 2010-02-01T09:49:26.627 回答
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>();
    }
}
于 2010-04-05T15:15:52.993 回答
0

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

在以下博客上找到了这个。

只需添加:

持久安全信息=真

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

于 2011-04-05T05:56:42.813 回答