我在C#中使用自制的依赖注入框架(可能是我的一个傲慢的错误,目前正在考虑切换到Ninject)。
我有3个进程,由类表示:
这负责通过GUI获取用户输入。 GUI使用输入字段显示所需的值,并将用户输入返回给流程。它的依赖关系是:GUI控制器以及我希望它得到的值(例如" Foo")。
这负责将一系列值映射到模板中的键。模板包含一些文本,此类填充间隙并返回已完成的文件。它的依赖关系是:模板文件,静态键值(常量)和动态键值,其值应来自GetInput进程。
这负责将文件写入磁盘。它的依赖关系是:文件路径和文件内容,文件内容应该来自BuildFile进程。
我希望能够为不同的文件类型配置这3个进程的组合。例如:
GetInput("Foo", "Bar") returns UserInput1, UserInput2
BuildFile(TemplateFileContent, {"StaticKey", "StaticValue"}, {"Foo", UserInput1}, {"Bar", UserInput2}) returns FileContent
WriteFile("C:/Some/Path.txt", FileContent)
我正在尝试在我的应用程序的组合根目录中构建这些配置,而我却无法让它工作。对用户输入的依赖使得在给出用户输入之前无法解析依赖关系,并且每个进程对前一进程的依赖性也是一个挑战。
您将如何连接这些依赖项?
我应该使用DI模式吗?
答案 0 :(得分:0)
如果您的用户输入在解决时不可用,那么您需要更改您的应用以获取输入,然后使用它来解决依赖关系,或者您需要通过使用方面来增强您的框架到"拦截"当GetInput类上的某些方法/事件触发时。基本上,您希望将BuildFile连接到用户输入可用的时间点。
说完所有这些之后,你的类看起来不像对象那么多,但更像是按顺序执行的程序代码,我认为你的大多数问题来自哪里。您可以通过将BuildFile和WriteFile组合到一个名为FileBuilder的类中来简化代码,并通过名为Write()的方法公开写入功能。
编辑: 如果你采取拦截的方式,你可能应该开始使用现有的DI框架,因为滚动你自己将是一个挑战。至于它的实现,您将要创建一个工厂方法,该方法根据输入返回FileBuilder依赖项的特定实例。这可以通过检查输入并调用FileBuilder的特定实例的解析来在拦截器内完成,或者,我通常更喜欢为了更好地分离关注点,将输入传递给BuildFile依赖关系的解析并让返回的实例由连接到BuildFile注册的工厂方法确定。允许位于DI注册码中的工厂方法知道有关接口实现的细节是有效的。