C# 项目之间的依赖注入

C# 项目之间的依赖注入,c#,visual-studio-2013,dependency-injection,C#,Visual Studio 2013,Dependency Injection,我正试图理解依赖注入的概念。我有一个VisualStudio解决方案。我将其分为3个项目:DataAccessLayer、ServiceLayer、BusinessLogicLayer ServiceLayer充当BusinessLogic和DataAccess之间的链接,从BusinessLogic中隐藏SQL和LINQ语句等内容 现在,许多在线教程建议使用DependencyInjection来使用MyBusinessLayer中ServiceLayer中的类。我认为,原因是业务层与服务层松

我正试图理解依赖注入的概念。我有一个VisualStudio解决方案。我将其分为3个项目:DataAccessLayer、ServiceLayer、BusinessLogicLayer

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

现在,许多在线教程建议使用DependencyInjection来使用MyBusinessLayer中ServiceLayer中的类。我认为,原因是业务层与服务层松散耦合。一、 但是,当这两个层(及其对应的类)位于不同的项目中时,我们并不完全理解如何实现这一点

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


我希望有人能给我一个“傻瓜依赖注射”式的回答,解释我的理解哪里是错的。提前感谢:)

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

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

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

您将有以下项目:

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

您不必实现自己的IoC和依赖注入。例如,您可以查看:-我非常喜欢此框架。

您正在寻找连接应用程序的位置,并且将使用所有层中的所有DLL。请查看。基本上,您总是在两个实现项目之间有一个接口项目,其中两个项目只“知道”接口项目,而不(一定)知道彼此。然后,正如@SamHolder所说,在您了解每个项目的合成根目录中,您需要执行必要的“管道”,即解析将哪个实现类用于哪个接口。相关:@user3259937它是否回答了您的问题?是的,它回答了。我将按照你建议的方式处理我的问题。非常感谢您,先生。通过让“根”(例如WPF应用程序)访问所有层,您不存在打破关注点分离的风险吗?开发人员可以(可能不知道)从WPF应用程序调用服务层(OP已经指出服务层在业务逻辑层后面),虽然答案中未提及,但假设DataAccessLayer也被引用,则可以直接编写代码,称之为“绕过所有其他层”。@d219您必须始终拥有将所有层连接在一起并具有几乎全局知识的位置,毕竟这是您的应用程序。它不必是根,它可以是一个单独的层。如果您希望加入根以外的所有内容以避免按根引用ServiceLayer,则可以。没有严格的规定。您甚至可以添加另一个名为DataAccessLayer的层,该层仅由ServiceLayer引用。它还取决于您对业务层和服务层的理解。一切取决于具体情况。但你们应该总是试着把事情分开——这就是我现在正在经历的思考过程;所有内容都是在根项目之外加入的,在一个由“根”引用的小项目中,很明显,引用其他所有内容的原因都是为了执行DI。