当使用连接字符串和dapper时,如何在运行时更改初始目录?

问题描述 投票:0回答:1

我正在编写一个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绑定的东西,然后简单地将初始目录改为指向不同的数据库?

c# asp.net-mvc-4 connection-string dapper ninject.web.mvc
1个回答
2
投票

你是否需要两个 NamedWhenInjectedInto 绑定的约束条件?

我相信你有一个类,需要同时具备 connectionstrings,这可以通过使用 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个。connectionstrings:

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
        }
    }
}

不过,我确实 推荐这种方法,上述班 违反了直接投资原则,因为有 不透明的依赖性.


我没有看到你的代码,但听起来你并没有在使用 储存库模式? 这可能是一个不错的选择...

© www.soinside.com 2019 - 2024. All rights reserved.