注意:我的代码恰好在 C# 中,但我认为这对解决问题并不重要。
问题
我正在尝试减少我们拥有的两个旧类中的代码重复,它们都用于从 XML 加载查询。它们都有获取 XML 位置的构造函数,都有Execute
接受 SQL 参数集合的方法,并且都提供了各种静态重载方法,以便快速轻松地运行带有单个命名参数或无参数或一个参数的查询具有非默认 SQL 连接对象。这些静态方法也接受 XML 位置作为参数,并在内部调用构造函数,依此类推,最后只返回 DataSet 的第一个 DataTable。
public static DataTable GetQuery(string queryName) { ... }
public static DataTable GetQuery(string queryName, string parameterName, string parameterValue) { ... }
public static DataTable GetQuery(string queryName, Hashtable parameters) { ... }
public static DataTable GetQuery(string queryName, Hashtable parameters, IConnection connection) { ... }
等等。
两者的区别在于,一个在文件系统中查找 XML 文件,另一个查找嵌入在程序集中的 XML 文件。
可能的解决方案 1
我正在考虑将它们统一成一个,可以使用单独IQuerySource
接口的不同实现,传递给构造函数或其他东西。但这意味着要么必须始终提前调用构造函数,要么每次GetQuery
都需要将方法传递给对象。IQuerySource
我试图避免这样的事情,因为这些GetQuery
方法在客户端代码中随处使用,用于快速的小事情,例如GetQuery("GetUserDetails","UserID",userId.ToString())
.
可能的解决方案 2
或者,我可以创建两个非常轻量级的类FileQuery
和DllQuery
,它们将位于统一类的顶部,并且它们总是会向下传递给构造函数和/或FileQuerySource
方法。这将使客户端代码保持较小,但除了核心类之外,我不希望在另外两个地方维护所有现有重载的(略微更薄的)版本!DllQuerySource
GetQuery
GetQuery
可能的解决方案 3
另一种选择与上述类似,但公开统一类,以便您可以调用,例如,DllQuery.Q.GetQuery("GetUserDetails","UserID",userId.ToString())
但是我不确定 DllQuery 如何拦截调用并确保统一类的 Q 实例始终获得正确的源工作。
另一个复杂性是,要从程序集中获取 XML,我们目前正在使用System.Reflection.Assembly.GetCallingAssembly()
,因此无论在何处调用它都必须直接位于客户端代码的表面之下,否则我们将获得 Data 程序集而不是客户端程序集。
我知道这个问题可能有点主观,但我希望有一些易于理解和定义明确的设计模式或其他东西来解决这个问题。