我正在编写一个MVC C#应用程序。我使用dapper作为轻量级的ORM。我的连接字符串是通过服务器和初始目录定义的,当前,如果我需要访问其他数据库,则可以定义另一个连接字符串,并使用Ninject绑定根据要注入的管理器使用特定的连接字符串,如下所示:
public class NinjectBindings : NinjectModule
{
public override void Load()
{
Bind<IDbConnection>().To<SqlConnection>()
.WhenInjectedInto<DashboardManager>()
.InRequestScope()
.Named("myDashboard")
.WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["dbDashboard"].ConnectionString);
Bind<IDbConnection>().To<SqlConnection>()
.WhenInjectedInto<ScoreboardManager>()
.InRequestScope()
.Named("myScoreboard")
.WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["dbScoreboard"].ConnectionString);
}
}
不幸的是,如果我在同一管理器中有代码需要调用与最初指定的目录不同的数据库上的存储过程,则此方法将无效。
问题是:我是否可以只定义一个连接字符串,丢失上面所有的ninject绑定内容,然后简单地将Initial Catalog更改为一个指向其他数据库的节点?
你既需要Named
和WhenInjectedInto
约束您的绑定?
我相信您有一个需要两个connectionstring
s的类,可以使用Named
绑定来实现:
Bind<IDbConnection>().To<SqlConnection>()
.InRequestScope()
.Named("myDashboard")
.WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["dbDashboard"].ConnectionString);
Bind<IDbConnection>().To<SqlConnection>()
.InRequestScope()
.Named("myScoreboard")
.WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["dbScoreboard"].ConnectionString);
您的班级可以同时获得两个连接:
public class ClassWith2DbDependency // <-- I would question this class for SRP violation
{
private readonly IDbConnection _dashboardConnection;
private readonly IDbConnection _scoreboardConnection;
public ClassWith2DBDependency(
[Named("myDashboard")] IDbConnection dashboardConnection
[Named("myScoreboard")] IDbConnection scoreboardConnection)
{
_dashboardConnection = dashboardConnection;
_scoreboardConnection = scoreboardConnection;
}
public void WriteTo2Dbs()
{
// execute dashboard DB procedure
// execute scoreboard DB procedure
}
}
我是否可以只定义一个连接字符串,丢失上面所有的ninject绑定内容,然后简单地将“初始目录”更改为一个指向其他数据库的节点?
更改Initial Catalog
不会影响现有的SqlConnection
。可以自己管理依赖项,但是您仍然需要2 connectionstring
s:
public class ClassWith2DbDependency
{
public void WriteTo2Dbs()
{
var dashboardCon = ConfigurationManager.ConnectionStrings["dbDashboard"].ConnectionString;
using (SqlConnection connection = new SqlConnection(dashboardCon))
{
// execute dashboard DB procedure
}
var scoreboardCon = ConfigurationManager.ConnectionStrings["dbScoreboard"].ConnectionString;
using (SqlConnection connection = new SqlConnection(scoreboardCon))
{
// execute scoreboard DB procedure
}
}
}
但是,我不推荐这种方法,因为上述类具有不透明的依赖关系,因此违反了DI原理。
我还没有看到您的代码,但是听起来好像您不是在使用Repository Pattern吗?这可能是一个不错的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句