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

Would it make sense to have an XML configuration file per module for DI?

我一直在阅读有关 DI 和组合根的信息。我在文章中读到只有应用程序应该有组合根,而不是库。

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

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

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

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

But let’s assume i have a reusable package with some interfaces and their implementation. I would like to bind that interface to the implementation.

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

如果您的可重用包是 ,您可以提供具体的 classes。正如我在 DI-Friendly Framework 中所写:

A Library is a reusable set of types or functions you can use from a wide variety of applications. The application code initiates communication with the library and invokes it.

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

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

可能有一些边缘情况,其中接口和(默认)实现与同一个包一起运送可能有意义,但我看不出它比 Yacoub Massad 推荐的那种默认工厂更能保证。您可以使 API 成为 Fluent Builder - 这是此类场景的常见模式。

如果您不想让任何人使用您的程序包,您可以提供所需的所有 XML 配置文件。