【问题标题】:Dependency Injection between projects项目之间的依赖注入
【发布时间】:2015-05-10 10:27:19
【问题描述】:

我正试图围绕依赖注入的概念展开思考。我有一个视觉工作室解决方案。我已将其拆分为 3 个项目:DataAccessLayer、ServiceLayer、BusinessLogicLayer。

ServiceLayer 充当 BusinessLogic 和 DataAccess 之间的链接,将 SQL 和 LINQ 语句等内容隐藏在 BusinessLogic 中。

现在,网上很多教程都推荐使用 DependencyInjection 在我的 BusinessLayer 中使用 ServiceLayer 中的类。我相信,原因是 BusinessLayer 与 ServiceLayer 松散耦合。但是,当这两个层(及其对应的类)在不同的项目中时,我并不完全理解如何实现这一点。

根据在线教程,我将让 ServiceLayer 中的类实现一个接口,该接口将在我的 BusinessLayer 中引用。但是这个接口应该定义在哪个项目呢?这个接口在ServiceLayer中定义是有道理的。但是从 BusinessLayer 引用这个接口会不会导致这些项目之间的逻辑紧密耦合?这会带走依赖注入的好处吗?

我希望有人可以给我一个“傻瓜依赖注入”之类的答案,让我解释我的理解错误的地方。提前谢谢你:)

【问题讨论】:

  • 您正在寻找Composition Root,这是连接您的应用程序的地方,它将使用来自所有层的所有 dll。
  • 看看stairway pattern。基本上你总是在两个实现项目之间有一个接口项目,两个项目只“知道”接口项目,而不是(必然)彼此了解。然后,正如@SamHolder 所说,在您了解每个项目的组合根目录中,您进行必要的“管道”,即解决哪个实现类用于哪个接口。

标签: c# visual-studio-2013 dependency-injection


【解决方案1】:

依赖注入是一件很棒的事情,因为它使您的代码独立于其他代码片段的实现。所有依赖项都应该通过构造函数(有时是属性)注入,在其中你只声明接口,而不是实现。

在这种情况下,您可以注入假实现来运行单元测试。您还可以编写多个版本,例如,您可以使用通用接口支持多个数据库,并根据用户的选择注入适当的实现。

现在如何实现它。您可以将接口提取到另一个项目,例如“Common”。这将阻止您在不需要它们的地方添加对实现的引用。然后您的 BusinessLayer 和 ServiceLayer 将引用 Common。

您将拥有以下项目:

  • 通用 - 依赖接口
  • ServiceLayer - 引用 Common 并实现这些接口
  • BusinessLayer - 引用 Common 并在构造函数中使用这些接口
  • Root - 例如,它可以是 WPF 应用程序。它具有对所有层的引用。应该有一种机制能够从 BusinessLayer 创建实例并从 ServiceLayer 向它们注入适当的实现

您不必实现自己的 IoC 和 DependencyInjection。您可以查看例如:Caliburn.Micro - 我真的很喜欢这个框架。

【讨论】:

  • @user3259937 它回答你的问题了吗?
  • 是的,确实如此。我会按照你建议的方式处理我的问题。非常感谢先生。
  • 通过授予“根”(例如 WPF 应用程序)访问所有层的权限,您是否没有破坏关注点分离的风险?开发人员可以(可能不知道)从 WPF 应用程序调用服务层(OP 已指示其位于业务逻辑层的“后面”),尽管假设 DataAccessLayer 也被引用,但在答案中未提及,则代码可能是也直接写称这是绕过所有其他层。
  • @d219 你总是必须有一个地方将所有层连接在一起并且几乎具有全局知识,毕竟这是你的应用程序。它不必是 Root,它可以是一个单独的层。如果您希望加入 Root 之外的所有内容以避免通过 Root 引用 ServiceLayer,您可以。没有严格的规定。您甚至可以添加另一个名为 DataAccessLayer 的层,该层仅由 ServiceLayer 引用。这也取决于您对业务层和服务层的理解。一切都取决于具体情况。但是您应该始终尝试将事物分开
  • 干杯——这就是我现在正在经历的思考过程;一切都加入了根项目之外,在一个由“根”引用的小项目中,很明显引用其他所有内容的原因仅仅是为了执行 DI。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多