每个模块有一个用于DI的XML配置文件有意义吗?

问题描述 投票:0回答:2

我一直在阅读DI和合成词根。我在文章中读到,只有应用程序应该具有合成根目录,而不是库。

但是假设我有一个可重用的程序包,其中包含一些接口及其实现。我想将该接口绑定到实现。我认为如果用户必须自己完成所有这些操作,将会很麻烦。

在可重用模块中包含XML DI配置文件是否有意义,该文件将在组合根目录中使用和处理?

dependency-injection inversion-of-control compositionroot
2个回答
3
投票

尽管类库不应包含合成根,但您始终可以在库中包括一个工厂,该工厂为简单的用例创建默认图。您在库中的类型仍将是公开的,以便高级用户可以自定义方式编写类型(例如,使用其特殊的修饰符修饰某些类型)。您包括的工厂也可以参数化以支持多个基本用例。

关于XML配置,尽管可以工作,但是在大多数情况下,维护使用XML进行DI配置的应用程序非常困难,因为一旦代码中的类型被重命名,XML中的类型名称将不会自动重命名。


0
投票

但是假设我有一个可重用的程序包,其中包含一些接口及其实现。我想将该接口绑定到实现。

为什么您的可重用包提供接口实现?

如果您的可重用包是library,则可以提供具体的类。当我在DI-Friendly Framework中写道:

一个库是一组可重用的类型或函数,可以从各种应用程序中使用。应用程序代码启动与库的通信并调用它。

根据Dependency Inversion Principle(DIP),客户端定义了其依赖项的抽象接口。库提供的任何接口都将违反DIP。

另一方面,如果您希望客户端代码提供实现,则可重用的程序包可以提供抽象(接口或基类)。在那种情况下,程序包开始看起来更像一个框架,尽管那里可能有一个灰色区域。通常,在这种情况下,程序包不必提供接口的任何实现,也可以为optional使用提供某些实现。

[在某些极端情况下,使用同一软件包提供的接口和(默认)实现可能都有意义,但我不认为它比Yacoub Massad建议的那种默认工厂具有更多的保证。您可以使该API成为Fluent Builder-这是这种情况的常见模式。

如果您不希望任何人使用您的软件包,则可以提供所需的所有XML配置文件。

© www.soinside.com 2019 - 2024. All rights reserved.