我第一次尝试使用依赖注入来松散耦合一个新的应用程序。我的问题是如何将状态信息传回给用户。在过去,所有代码都塞进 GUI 中,如果非常混乱且无法维护,这很容易。类的安排是这样的(请不要检查我的 UML 技能——它们不存在):
如果我们选择右手边。AirportsInformationRepository 只存储数据并在被询问时提供给控制器。一开始,它使用 Persist 类获取信息,以从用户硬盘驱动器中获取与给定过滤器匹配的文件。它使用反编译器从文件中提取信息。所有这些都可以正常工作,并且信息本身会按应有的方式进入 GUI。
同时,我的问题是如何告诉用户正在发生的事情。这可能发生在反编译器中,例如,如果它获得的文件无法反编译或可能不包含数据。如果配置文件在说谎并且某些文件夹不存在,则它可能发生在 Persist 类中。除非出现致命错误,否则此类问题不应停止该过程。
如果出现致命错误,则需要立即返回给用户,整个过程应该停止。否则,可以通过该过程以某种方式收集警告,然后在扫描完成时显示。
我熟悉日志记录,并且该应用程序确实有一个记录器来监视应用程序是否存在未处理的异常和其他故障。这写入磁盘,我像大多数人一样使用它来处理错误。我不想将其用于向用户报告状态,因为老实说,如果找不到文件或用户输入了配置文件的无效路径,则应用程序没有任何问题。
我考虑过:
- 在每个类中累积一个日志,并在进程完成(或失败)时将其传递回消费者。我发现这真的很乱
- 使用事件,但如果消费者正在订阅并且事件以与日志相同的方式传递链,那么我认为这并没有好得多。我想另一种方法是让 GUI 直接订阅,但它不应该对反编译器一无所知....
- 一个家庭滚动记录器,它可以是静态类,也可以在 program.cs 中实例化
- 某种消息传递框架——我承认我不清楚,但我认为它与中央事件处理程序非常相似,GUI 可以订阅它而无需了解其他类的任何信息。
所以总结一下。什么是积累“一切照旧”状态信息并在扫描结束时将其提供给 GUI 的最佳方式,同时能够在致命问题上停止。
提前感谢您阅读本文。为帖子的长度道歉。
编辑 我应该说该应用程序使用的是 NET 3.5。我会改变它以获得一个优雅的解决方案,但是......