[英]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.