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>();
}
}