c# - 依赖注入(inject) SQL 连接?

标签 c# sql dependency-injection

首先,我开始使用 StructureMap,但任何 DI 框架中的示例都可以。

我有一个类,

public class GeoData
{
   public List<Country> GetCountries()
   {
      IDbConnection con = new SqlConnection(ConfigurationManager.ConnectionString["GeoDataConnection"])    
      //Sql stuff to return countries from a database
   }
}

这是类实际外观的简单 View ,但本质上就是这样。

现在,我有一个新的要求。我需要能够在类初始化或方法上更改连接字符串。例如

public void Do()
{
   var geoData = new GeoData();

   if(x)
   {
      geoData.ConnectionString = ConfigurationManager.ConnectionString["LIVEGeoDataConnection"]);
   }
   else
   {
      geoData.ConnectionString = ConfigurationManager.ConnectionString["STAGINGGeoDataConnection"]);
   }

   geoData.GetCountries();
}

使用依赖注入(inject)是否有更好的解决方案?您将如何使用您选择的 DI 框架来做到这一点?

最佳答案

从技术上讲,Wim Hollebrandse 已经回答了您的问题,但我只是想指出,我个人会采用另一种方式,因为我不喜欢每次实例化类时都必须传递连接字符串。我知道您有一个默认构造函数,但我认为我们仍然可以使它更简洁一些。

首先,我会创建一个静态类来获取您的连接,如下所示:

public static class ConnectionFactory
{
    public static IDbConnection GetConnection()
    {
        return GetConnection(ConfigurationManager.ConnectionString["GeoDataConnection"]);
    }

    public static IDbConnection GetConnection(string connectionString)
    {
        return new SqlConnection(connectionString);
    }
}

然后,我会像这样使用它:

public class GeoData
{
   public List GetCountries()
   {
      using (IDbConnection con = ConnectionFactory.GetConnection())
      {
        //Sql stuff to return countries from a database
      }
   }
}

使用这种方法,如果默认连接字符串发生变化,您只需更改一行代码,而不是转到引用配置文件中的连接字符串的每一行。但是,它确实为您提供了在必要时覆盖连接字符串的能力。

希望对您有所帮助...

关于c# - 依赖注入(inject) SQL 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1737745/

相关文章:

asp.net-mvc - Unity 使用参数将依赖项注入(inject)到 MVC 过滤器类中

c# - 将不透明度设置为网格会更改 Windows 8 中子控件相互之间的不透明度

c# - 使用 Azure Web 部署时保存到 Azure 根文件夹

sql - 在数据库中存储性别(性别)

mysql - 如何优化这个MySQL查询

java - Spring @Aspect 未正确 Autowiring

c# - IUserStore[Models.ApplicationUser] 不是通过 Unity Interface to Class 解析的,而是通过 InjectionConstructor 解析的

c# - BooleanToVisibilityConverter 与 Caliburn.Micro 一起使用的奇怪行为

c# - Silverlight - 命名空间中不存在 ViewModelLocator

mysql - 查询一个表,然后从另一个表中获取与该查询对应的所有行