我正在编写一个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绑定的东西,然后简单地将初始目录改为指向不同的数据库?
你是否需要两个 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
}
}
}
不过,我确实 不 推荐这种方法,上述班 违反了直接投资原则,因为有 不透明的依赖性.
我没有看到你的代码,但听起来你并没有在使用 储存库模式? 这可能是一个不错的选择...