如何将控制反转用于一系列依赖于用户输入和彼此的过程

本文关键字:输入 用户 过程 依赖于 一系列 控制 用于 | 更新日期: 2023-09-27 18:33:13

Intro

我正在使用自制依赖注入框架的 C# 工作(也许是我的一个傲慢的错误,目前正在考虑切换到 Ninject(。

我有 3 个进程,由类表示:

获取输入

这负责通过 GUI 获取用户输入。GUI 使用输入字段显示所需的值,并将用户输入返回到流程。它的依赖关系是:GUI控制器和我希望它获得的值(例如"Foo"(。

构建文件

这负责将一系列值映射到模板中的键。模板包含一些文本,此类填充空白并返回完成的文件。它的依赖项是:模板文件、静态键值(常量(和动态键值,其中的值应来自 GetInput 进程。

写文件

这负责将文件写入磁盘。它的依赖关系是:文件路径和文件内容,其中文件内容应来自 BuildFile 进程。

期望的情况

我希望能够为不同的文件类型配置这 3 个进程的组合。例如:

配置A


GetInput("Foo", "Bar") returns UserInput1, UserInput2
BuildFile(TemplateFileContent, {"StaticKey", "StaticValue"}, {"Foo", UserInput1}, {"Bar", UserInput2}) returns FileContent WriteFile("C:/Some/Path.txt", FileContent)

现状

我正在尝试在我的应用程序的复合根中构建这些配置,但我无法让它工作。对用户输入的依赖使得在给出用户输入之前无法解析依赖关系,并且每个进程对前一个进程的依赖也是一个挑战。

问题

您将如何链接这些依赖项?

是否有我应该使用的 DI 模式?

如何将控制反转用于一系列依赖于用户输入和彼此的过程

如果你的用户输入在解析时不可用,那么你要么需要更改你的应用,以便它获取输入,然后使用它来解决依赖关系,要么你需要通过使用一个方面来加强你的框架,当 GetInput 类上的某些方法/事件触发时。基本上,您需要将 BuildFile 连接到用户输入可用的时间点。

说了这么多,你的类似乎不像对象那样表现,而更像是按顺序执行的存储过程代码,我认为这是你的大部分问题的来源。例如,您可以通过将 BuildFile 和 WriteFile 合并到一个名为 FileBuilder 的类中来简化代码,并通过名为 Write(( 的方法公开写入功能。

编辑:如果你走拦截的路线,你可能应该开始使用现有的 DI 框架,因为推出自己的框架将具有挑战性。至于它的实现,您需要创建一个工厂方法,该方法根据输入返回 FileBuilder 依赖项的特定实例。这可以通过检查 FileBuilder 特定实例的输入和调用解析在拦截器内部完成,或者,为了更好地分离关注点,我通常更喜欢将输入传递给 BuildFile 依赖项的解析,并让返回的实例由连接到 BuildFile 注册的工厂方法确定。允许位于 DI 注册代码中的工厂方法了解有关接口实现的详细信息是有效的。