繁体   English   中英

通过接口和项目结构进行依赖注入

[英]Dependency Injection through Interface and project structure

这个问题很难解释,但我会尽力而为。

我有一个项目,我必须在其中创建一个UI,该UI从第三方服务获取数据并进行反序列化和一些线程管理工作。

现在,我的项目结构在Visual Studio中处于一种解决方案下:

项目A:UI

项目B:从第三方服务获取数据的API

项目C:线程管理器API

注意:项目B具有IB接口,而项目C具有IC接口以帮助依赖性注入。 项目B和C将来会被其他团队使用。

项目A使用IB和IC接口进行依赖项注入。

现在,我将陈述对IOC的理解:DIP表示高级模块不应依赖于低级模块,而高级模块和低级模块均应依赖于抽象。 如果要防止在更改低级模块时更改高级模块,则需要反转控件,以使低级模块不会控制高级模块所需的接口和对象的创建。

根据以上定义,IB和IC接口都应在项目A中定义,对吗? 如果他们在项目A中,那么其他团队将如何使用IB和IC接口? 我是否要制作另一个单独的项目来存储接口?

考虑以下针对您的方案的示例项目组织:

项目A:Bootstrapper,负责运行应用程序,配置DI和设置UI(这也可以在与应用程序和UI分离的专用Bootstrapper项目中进行)。 知道B,C,D,E,F

项目B:UI(或使其模块化所需的项目数)。 知道C

项目C:业务逻辑( gets data from a third party service and does deserialization and some thread management work )。 知道D

项目D:包含IB和IC的接口(它们也可以有单独的专用项目)。

项目E: The API to get data from third party service 知道D

项目F: The Thread Manager API 知道D

注意,通过业务逻辑层从UI和实现中分离。 这样,您可以切换实现细节,而不必更改业务逻辑或UI。 此外,如果您的业务逻辑有所不同,那么影响也将降至最低。

关于DI,bootstrapper项目是唯一具有整体情况的项目,其余项目应仅使用由bootstrapper设置的容器将为它们解析(即注入)的接口。

根据以上定义,IB和IC接口都应在项目A中定义,对吗?

不能。您应该将“模块”一词替换为“类”。 在这种情况下,它变得更加有意义:

高级[类]不应依赖于低级[类],高级和低级[类]均应依赖于抽象。

为了能够正确进行依赖注入,这些类和抽象位于哪个程序集中都没有关系。 当项目变大时(例如,数百万行代码,一个或多个团队在其中工作),遵守组件设计原则就变得很重要。

在您的情况下,由于程序集A和B都使用接口IB ,而程序集A依赖于程序集B,因此IB永远都不能位于程序集A中,因为这样会在程序集中引用一个圆形引用。 您将不得不将IB放置在装配B中,或者放置在A和B都引用的新装配中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM