【发布时间】:2013-07-30 00:31:53
【问题描述】:
我已经阅读了很多关于依赖注入和服务定位器(反?)模式的内容 - 很多都在 StackOverflow 上(谢谢大家 :)。我有一个关于这种模式在 n 层架构中如何工作的问题。
我看过很多博客文章,其中描述了将 IDataAccess 组件注入业务对象。例如
public class Address
{
IDataAccess _dataAccess;
public Address(IDataAccess dataAccess)
{
this._dataAccess = dataAccess;
}
}
但是,我的印象是,在 n 层架构中,UI 层应该不需要任何数据访问层的知识......甚至不需要知道 /is/ 有数据访问层!如果 DI 需要在 BusinessObjects 的构造函数中公开 IDataAccess 接口,那么这会向 UI 公开业务层在后台使用数据访问层这一事实 - UI 肯定不需要知道或关心的事情?
所以,我的基本问题是:DI 是否要求我将所有下层接口暴露给所有上层,这是好事还是坏事?
谢谢
编辑:为了澄清(在几个 cmets 之后),我知道我的业务对象应该不知道它使用哪个特定的 实现 IDataAccess(因此将依赖项注入到构造函数中)但是我认为 BO 之上的层不应该知道业务对象甚至 需要 对 DAL 的依赖。
【问题讨论】:
-
我真的不明白为什么您需要将任何类型的数据访问层传递给
Address类。数据和视图之间的“粘合”过程应该在宿主控制器/视图模型中完成(取决于架构),这意味着您可以将数据映射到上述控制器/视图模型中的业务对象。 -
您认为业务层究竟是如何获取数据的?它必须调用something,而那个东西就是你注入的东西。否则,业务层将无法使用。当然,除非您实际上并不是指业务层,而是指的是 POCO 之类的东西,它们应该与数据无关,但它们本身并不是业务层。
-
我真的需要写一篇关于这个的博客,因为这是一个很常见的问题。也许如果你查看“Composition Root”,你会得到一些更好的关于构建 DI 图以及依赖关系如何向下传播的例子.
-
你可能会觉得这篇文章很有趣:blog.ploeh.dk/2012/02/09/IsLayeringWorththeMapping
-
@ColinSmith - 这是一个古老的论点,并且已经被重新讨论过很多次。是的,从技术上讲,您的 UI 依赖于您的数据层,因为您的 UI 成为“组合根”,但是通过将其限制为仅 DI 的配置部分,您可以将其降至最低。这是那些必要的邪恶之一。
标签: c# architecture dependency-injection