处理ONE DataAccess Layer中的多个连接字符串

我有一个有趣的困境。 我目前有一个DataAccess层,它必须与多个域一起工作,并且每个域都有多个数据库存储库,具体取决于所调用的存储过程。 AS现在我只是使用SWITCH语句来确定运行应用程序的机器并从Web.config返回相应的连接字符串。 现在我有一个艰巨的任务,即在同一个SQL服务器中处理多个数据库存储库,而id就像根据调用的存储过程动态确定连接字符串一样。 也许我在想这个,但我无法理解我将如何应对这一点。

我要说的第一件事是你的设计可能存在缺陷,因为需要跨多个数据库调用多个存储过程并不常见。

但是,有许多选项可用,例如:

  1. 在web.config中存储存储过程的列表以及每个存储过程的相应连接字符串,并在运行时检索它们。
  2. 有一个列出存储过程和连接字符串的集中表(因此web.config中只有一个连接字符串,只是指向存储过程连接字符串中央表的连接字符串)。

如果您只需要确定数据库是存储过程调用,那么在配置文件中,定义您自己的配置部分,将存储过程名称映射到连接字符串。 那将是最明确的,但需要维持。

您也可以将其集中到一个较小的目录数据库中,该数据库存储针对存储过程名称的连接字符串 – 然后您可以创建一个SQL脚本,通过查询其他数据库对象来自动保持信息的最新和正确(没有拼写错误或拼写错误) 。

然后我会将其读入内存(缓存它),以便您可以避免在应用程序的生命周期内多次调用此目录数据库。 继续我可以推测出关于数据库整体结构的小信息(并忽略了这个结构如何通过的问题),我会说这是一个可管理的解决方案。

您可以通过使基本DAL类负责返回适合给定过程名称的连接来改进此解决方案 – 因此任何代码更改只需要在一个位置发生以返回不同的连接。 其余的代码调用GetConnection("getCustomers")并且幸福地忽略了细节。

如果您可以根据存储过程名称唯一性真正映射单个连接字符串,那么尝试的一个有趣的事情是动态发现应用程序启动时连接字符串列表中可用的存储过程并缓存映射。

您似乎可以使用允许您命名(分类)连接字符串的常规ConnectionStrings配置。 在代码中的某个时刻,您专门调用存储过程。 该调用是否也可以指定要使用的连接字符串的键? 即:报告,会员等

     

对您的DAL的调用可能如下所示:

 var result = ExecStoredProcedure("Reporting", "up_SomeProcedure"); 

假设您的DAL只是一个试图操纵几个不同数据库的数据的程序集。 我建议,将代码拆分为每个数据库的单独程序集。 然后,您可以获得每个程序集的特定配置信息,代码将只查看正在执行的程序集的特定配置信息。

例如,假设您有一个Movies数据库和一个Books数据库。 您将创建一个知道如何操作电影数据库中的数据的库,并且创建,编辑和查询电影所需的所有代码和存储过程都将在该库中。 该库将拥有自己的配置信息,包括数据库的连接字符串。

同样,为了与您的图书数据库进行交互,您将拥有一个单独的库,其中包含用于创建,编辑和查询有关图书的信息的所有存储过程。 同样,这将拥有它自己的配置信息,包括连接字符串。

这种方法可以灵活地添加更多数据源,并相互独立地配置它们。

如果您愿意,您当然可以使用另一个库来处理可能需要访问这两个数据库的事务,并引用前面提到的库中的代码。

这确实是一个有趣的挑战。 从设计角度来看,这可以通过各种方式解决,但它们似乎都有点破碎。

那么在这种情况下,对我来说唯一真正有用的是:

在每个服务器上创建一个过程数据库,并在此数据库上具有调用实际过程的“接口”过程。

喜欢:

 CREATE PROC pr_GetAddress ( @addressId int ) AS BEGIN exec pubs.dbo.pr_GetAddress @addressId END 

这样您就可以保留现有代码。

您可以使用代码生成为“接口”过程创建sql语句。

加:

这只是让我大吃一惊……为什么不使用Linq-to-Sql DataContext?

我刚刚在这里玩这个片段:

 public class ExperimentalDataContext: DataContext { public ExperimentalDataContext(string connectionString) : base(connectionString) { } public IExecuteResult ExecuteMethod(object instance, MethodInfo methodInfo, params object[] parameters) { return this.ExecuteMethodCall(instance, methodInfo, parameters); } [Function(Name = "dbo.fx_Levenstein", IsComposable = true)] public static System.Nullable fx_Levenstein([Parameter(DbType = "NVarChar(255)")] string firstword, [Parameter(DbType = "NVarChar(255)")] string secondword) { using (ExperimentalDataContext context = new ExperimentalDataContext(GetConnectionString("your-connectionstring"))) { return ((System.Nullable)(context.ExecuteMethod(context, ((MethodInfo)(MethodInfo.GetCurrentMethod())), firstword, secondword).ReturnValue)); } } private static string GetConnectionString(string key) { return ConfigurationManager.ConnectionStrings[key].ConnectionString; } }