我正在努力思考依赖注入(inject)的概念。我有一个 Visual Studio 解决方案。我将它分成 3 个项目:DataAccessLayer、ServiceLayer、BusinessLogicLayer。
ServiceLayer 充当 BusinessLogic 和 DataAccess 之间的链接,从 BusinessLogic 中隐藏 SQL 和 LINQ 语句等内容。
现在网上很多教程都推荐使用DependencyInjection在我的BusinessLayer中使用ServiceLayer中的类。我相信,原因是 BusinessLayer 与 ServiceLayer 松耦合。然而,当这两层(及其对应的类)在不同的项目中时,我不完全理解如何实现这一点。
根据在线教程,我将让我在 ServiceLayer 中的类实现一个接口(interface),这将在我的 BusinessLayer 中引用。但是这个接口(interface)应该定义在哪个项目呢?这个接口(interface)定义在 ServiceLayer 中是有道理的。但是从 BusinessLayer 引用这个接口(interface)不会导致这些项目之间的逻辑紧密耦合吗?这会剥夺依赖注入(inject)的好处吗?
我希望有人能给我一个“Dependency Injection for Dummies”之类的答案来解释我的理解错误的地方。提前谢谢你:)
最佳答案
依赖注入(inject)是一件很棒的事情,因为它使您的代码独立于其他代码片段的实现。所有依赖项都应该通过构造函数(有时是属性)注入(inject),在构造函数中您只声明接口(interface),而不是实现。
在这种情况下,例如,您可以注入(inject)伪造的实现来运行单元测试。您还可以编写多个版本,例如,您可以使用通用接口(interface)支持多个数据库,并根据用户的选择注入(inject)适当的实现。
现在如何实现。您可以将接口(interface)提取到另一个项目,例如“Common”。这将阻止您在不需要的地方添加对实现的引用。然后您的 BusinessLayer 和 ServiceLayer 将引用 Common。
您将拥有以下项目:
- 通用 - 依赖接口(interface)
- ServiceLayer - 引用 Common 并实现这些接口(interface)
- BusinessLayer - 引用 Common 并在构造函数中使用这些接口(interface)
- 根 - 例如,它可以是 WPF 应用程序。它具有对所有层的引用。应该有一种机制能够从 BusinessLayer 创建实例并从 ServiceLayer 向它们注入(inject)适当的实现
您不必实现自己的 IoC 和 DependencyInjection。例如,您可以查看:Caliburn.Micro - 我真的很喜欢这个框架。
关于c# - 项目之间的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30150291/