【问题标题】:Injecting repository from UI seems wrong to me [closed]从 UI 注入存储库对我来说似乎是错误的 [关闭]
【发布时间】:2013-11-05 17:25:26
【问题描述】:

我对在用户界面中注入存储库的趋势似乎有些困惑。

我一直在构建或工作在 UI 完全不了解存储库层但只知道上面的层的系统上。

谷歌搜索了一下,发现了一个和我有同样问题的开发者,见下面的链接

https://softwareengineering.stackexchange.com/questions/199799/should-a-repository-be-passed-in-to-the-user-interface

但是阅读答案我仍然不清楚,对我来说,我们应该将存储库注入到 ui 中并不好。

如果我有以下情况,

UI(dll1)-->ServiceGateway(dll2)->Service(wcf)(dll3)-->BizLayer(dll3)-->Dal(dll3)

为什么要一直注入存储库?

是的,它很适合模拟,但没有什么能阻止开发人员直接从 UI 调用存储库。这种情况已经发生了很多次。

有人可以指出一个链接或解释为什么以前不好的东西现在是“最佳实践”吗?

【问题讨论】:

  • 呃,谁说这是最佳实践?另外,这有点自以为是,不知道你是否会得到一些明确的答案......
  • 我说“最佳实践”的原因是因为无论你怎么看,他们似乎都在做。那么他们做错了吗。我想我永远不会得到明确的答案
  • 您能否提供一个参考来强调这是不好的做法?仅仅因为“他们似乎都在这样做”并不是特别令人信服。

标签: c# architecture repository-pattern


【解决方案1】:

存储库是 UI 和持久性之间的抽象。您可能需要比这更多的抽象级别,或者可能就足够了。这将取决于应用程序。重要的是该抽象层存在,UI 通过该抽象层访问持久性功能,并且该层被注入到 UI 中,而不是通过定位器(反)模式访问。

【讨论】:

  • 感谢您抽出宝贵时间回答但仍然没有回答我的问题。您的看法是什么?您是否从 ui 中注入存储库。对不起,直接但很多话但我不清楚
  • 我不清楚“从 ui 注入存储库”是什么意思。您可以将存储库注入 UI,除非涉及到其他层,在这种情况下,您可以将其中一个层注入 UI。
  • 让我们在 web 应用程序或 winapp 在他们的引导程序中简化它,他们实例化他们的存储库并注入 wcf 服务或 bizlayer 这就是我的意思。这对我来说似乎是错误的。
【解决方案2】:

很抱歉,我也不能给你一个明确的答案,但我确实和你一样担心。

在最近的一个项目中,我设置了数据库、dal 和 bll 的一部分,pm 一直在努力将数据隐藏在 UI 中,我完全同意。然后突然间,他坚持要从 UI 中注入存储库 - 因为这使测试更容易。

我想,我和你一样困惑。 当我问什么是阻止开发人员直接访问数据时,因为他可以访问存储库,他的回答是“他不应该”。 因此,我们构建了一个具有独立层的完整框架,以确保我们控制数据访问,最终只依赖于“让我们希望开发人员表现良好”。

我完全赞成将存储库注入尽可能合理地靠近数据层,当然不会将这个责任留给 UI。

【讨论】:

  • 无论您做什么,归根结底,您始终依赖于表现良好的开发人员。
  • @oerkelens 你很清楚我们有同样的担忧。我们有大型开发团队 (150),你没有机会控制它!很高兴你回答我开始感到“孤独”,因为这些传播不好的做法
  • @oerkelens 还想补充一点,这正是我的 PM 所说的“你必须从 UI 注入存储库”,因为他读过一本他们正在这样做的书。我将再次推动移动尽可能晚地注入存储库。
  • @Chris 是的,你当然是。但实际上留下直接访问在您的 UI 周围徘徊的数据的可能性并期望他们使用它似乎有点像要求他们行为不端:)跨度>
【解决方案3】:

您的 WCF 服务应该注入数据源,因为它是一个独立的应用程序,恰好暴露了数据,并以这种方式充当基于它的应用程序的 DAL。

您的网站 (UI) 并不关心您的服务 (DAL) 如何获取其数据。

在您的示例中,只有 UI 在启动时使用 ServiceGateway 注入自身才有意义。它不需要(必须)知道任何关于服务实现的信息,它只是调用服务。

事实上,除非您从 UI 自托管 WCF 服务,否则您甚至无法对来自消费应用程序的服务依赖项做任何事情:服务必须在 service 启动时注入它们.在这种情况下,自托管也意味着 ASP.NET 网站托管自己的服务。在这种情况下,您还会在 Global.asax 中找到该服务的存储库注入,因为它在网站和服务之间共享(我仍然建议不要这样做)。

【讨论】:

  • 不确定我是否理解你的答案(我的每个 wcf 服务都是一个独立的单元)现在我的问题不是关于 wcf 甚至认为它发挥了作用。为什么人们一直注入存储库。它会从业务层或服务层向下注入它对我有意义吗?
  • @user 我的意思是你不应该从 UI 注入存储库。此外,鉴于您的 WCF 服务作为独立应用程序运行,消费应用程序如何甚至注入存储库?
  • 抱歉不清楚。我可以/使用统一将接口注入到我的 wcf 构造函数中,这样我就可以开始模拟 biz 层。我似乎得到的是问题而不是答案。可能是我问错了。是否有任何使用“最佳实践”的示例应用程序,我似乎发现的只是到处注入存储库。
  • “我可以/使用 unity 将接口注入到我的 wcf 构造函数中,这样我就可以模拟 biz 层” - 这是正确的。例如,您可以通过 WCF 服务的Global.asax 执行此操作。您的 UI 不能也不应该注入服务的依赖项。
  • 那么为什么有这么多人在他们应该只注入上面的层时注入他们的存储库接口?
猜你喜欢
  • 1970-01-01
  • 2019-07-15
  • 2020-06-30
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
相关资源
最近更新 更多