例如,您有一个IRepository
界面。您还有一个SqlRepository
类,它实现了由SQL数据库支持的接口。假设该类的构造函数采用连接字符串。如果您的存储库进行存储过程调用,并且这些调用是存储库内部的,那么这不是隐藏的依赖项吗?您的存储库不仅依赖于连接字符串指定的数据库连接,还依赖于安装了正确存储过程的数据库。如果您的后备数据库没有这些存储过程,您的程序将崩溃。如果您无法访问SqlRepository
的代码,您如何知道必须安装哪些存储过程才能运行程序?这种隐藏的依赖性是否会让DI倡导者感到畏缩?
答案 0 :(得分:1)
嗯......您的存储库还取决于具有某些表的数据库,以及具有某些列的那些表。这些都是依赖性的,但它们并没有特别隐藏。
实际上,那些甚至比存储过程更大的依赖性。可以重写存储库以避免需要它们,但数据确实必须存在......
答案 1 :(得分:1)
是。问题是没有办法在SQL数据库上强加契约(面向对象意义上的契约)。
也就是说,我们没有办法说数据库符合IPersonRepository
接口,因此我们无法确定它是否实现了一个返回两个结果集的过程“dbo.GetPerson”列a,b,c和d。 (或者我们有权执行该过程。)因此,我们不能在连接字符串中要求IPersonRepository
。
像(N)Hibernate这样的成熟对象关系映射器通过创建特定于域的语言来描述这些期望(它们精心设计的配置规范)来解决这个问题,但这些技术只是部分解决方案,因为它们不能强制执行数据库方面。
这是object-relational impedance mismatch的另一个方面,虽然我没有看到任何书面文字。