Mapping Ninject:当请求DbConnection时,提供一个未打开的SqlConnection

Mapping Ninject:当请求DbConnection时,提供一个未打开的SqlConnection,mapping,database-connection,ninject,sql-server-2008-express,Mapping,Database Connection,Ninject,Sql Server 2008 Express,我想使用Ninject将DbConnection映射到未打开的SqlConnection。这就是我所做的: string constr = @"Server=.\SQLEXPRESS; Trusted_Connection=True; Database=TestDB"; Bind<DbConnection>().To<SqlConnection>() .Using<OnePerRequestBehavior>() .WithConstruct

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

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

Bind<DbConnection>().To<SqlConnection>()
    .Using<OnePerRequestBehavior>()
    .WithConstructorArgument("connectionString", 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();
    }
}
公共类MSSQL模块:标准模块
{
私有字符串constr=@“Server=AASLOEG\SQLEXPRESS;Trusted_Connection=True;Database=Booking_Test”;//System.Configuration.ConfigurationManager.ConnectionString[“mssql”].ConnectionString;
公共覆盖无效负载()
{
使用构造函数参数将()绑定到()(“connectionString”,constr);
var test=Kernel.Get();
test.Dispose();
}
}

var test=Kernel.Get()上有一个断点
经过一步,我看到
test
中填充了
SqlConnection
,但是
ConnectionString
属性是空的。

您拥有的代码似乎很好,如果您请求
DBConnection
,Ninject应该使用绑定或comnplain

您确定
ImplicitSelfBinding
没有介入吗?您能在yout
模块中关闭它吗?(但要做到这一点,您需要注入
SqlConnection


如果在
Bind
行之后立即执行
Get()
操作,会发生什么情况?

您拥有的代码似乎很好,如果您请求
DBConnection
,Ninject应该使用绑定或comnplain

您确定
ImplicitSelfBinding
没有介入吗?您能在yout
模块中关闭它吗?(但要做到这一点,您需要注入
SqlConnection


如果在
Bind
行之后立即执行
Get()
会发生什么情况?

我最终通过创建一个自定义提供程序并绑定到它来解决这个问题。(我还升级到了Ninject 2.0,这可能会影响结果…)

公共类MsSqlConnectionProvider:DbConnectionProvider
{
公共字符串ConnectionString{get{return TestConnectionString;}}
公共字符串ConnectionStringFromConfigFile{get{return System.Configuration.ConfigurationManager.ConnectionStrings[“mssql”].ConnectionString;}}
公共字符串TestConnectionString{get{return@“Server=AASLOEG\SQLEXPRESS;Trusted_Connection=True;Database=Booking_Test”;}
受保护的覆盖SqlConnection CreateInstance(IContext上下文)
{
返回新的SqlConnection(ConnectionString);
}
}
公共类MsSqlModule:ninject模块
{
公共覆盖无效负载()
{
Bind().ToProvider();
}
}

我最终通过创建一个自定义提供程序并绑定到它来解决这个问题。(我还升级到了Ninject 2.0,这可能会影响结果…)

公共类MsSqlConnectionProvider:DbConnectionProvider
{
公共字符串ConnectionString{get{return TestConnectionString;}}
公共字符串ConnectionStringFromConfigFile{get{return System.Configuration.ConfigurationManager.ConnectionStrings[“mssql”].ConnectionString;}}
公共字符串TestConnectionString{get{return@“Server=AASLOEG\SQLEXPRESS;Trusted_Connection=True;Database=Booking_Test”;}
受保护的覆盖SqlConnection CreateInstance(IContext上下文)
{
返回新的SqlConnection(ConnectionString);
}
}
公共类MsSqlModule:ninject模块
{
公共覆盖无效负载()
{
Bind().ToProvider();
}
}
有点晚了,但是

在博客上找到这个

只需添加:

持久安全信息=True

…连接到您的连接字符串。为我工作。有点晚了,但是

在博客上找到这个

只需添加:

持久安全信息=True


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

我已经用结果更新了我的问题。如何控制隐式自身绑定?(但不是,我正在注入
DbConnection
…)隐式地将其selfbindingDefault传递到模块(或者是内核还是两者兼而有之?)。您可以通过查看模块的ImplicitSelfBinding属性来查看状态。它只意味着类X被绑定到X。(也就是说,它可能与您的案例无关-如果它处于启用状态,并且您没有绑定,那么Ninject将允许您获得一个SqlConnection,并且它将是默认构造的。如果您确定要解析一个DBConnection,它不会在您背后跳入并提供一个默认构造的SqlConnection或任何疯狂的东西)我已经用结果更新了我的问题。我如何控制ImplicitSelfBinding?(但不是,我正在注入
DbConnection
…)implicitselfbindingsdefault被传递到模块中(或者它是内核还是两者兼而有之?)构造。通过查看模块的ImplicitSelfBinding属性可以看到状态是什么。这只意味着类X被绑定到X。(也就是说,它可能与您的案例无关-如果它处于启用状态,并且您没有绑定,那么Ninject将允许您获得一个SqlConnection,并且它将是默认构造的。如果您确定要解析一个DBConnection,它不会在您背后跳入并提供一个默认构造的SqlConnection或任何疯狂的东西)你不是说
**Query**String
是吗?这是你唯一的
Bind
调用吗?不知道
Get()
怎么会无法通过arg[并选择非默认的构造函数重载]如果是。你确定
constr
是在你
Bind
的位置初始化的吗?@Ruben,请查看我的更新。不,这不是一个查询字符串;)你不是说
**查询**字符串
吗?这是你唯一的
Bind
调用吗?不知道
Get()
怎么可能无法通过参数[并选择ctor的非默认重载]如果是。您确定
constr
在绑定时已初始化?@Ruben,请查看我的更新。不,它不是查询字符串;)
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();
    }
}
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>();
    }
}