请考虑以下情况:存在类SampleViewModel
,它依赖于类FileDataReader
和TransmissionManager
(TransmissionManager
也依赖于类FileDataReader
),其中FileDataReader
可以处于有效或无效两种状态。无效状态意味着这个实例不能被使用(它从文件中读取数据,如果这个文件被损坏,状态变为无效)。没有FileDataReader
, SampleViewModel
和TransmissionManager
的实例也是无用的,因为这个依赖关系是至关重要的。我应该如何编写合适的代码将这三个类连接在一起?
public class FileDataReader
{
public bool IsDataValid { get; private set; }
public FileDataReader()
{
IsDataValid = ReadAllData();
}
private bool ReadAllData()
{
// ...
}
}
public class TransmissionManager
{
private readonly FileDataReader _reader;
public TransmissionManager(FileDataReader reader)
{
_reader = reader;
}
// all methods need reader to be valid in order to work
}
public class SampleViewModel
{
private readonly FileDataReader _dependency;
public SampleViewModel(FileDataReader dependency, TransmissionManager manager)
{
_dependency = dependency;
if (_dependency.IsDataValid)
{
// crucial code that operates on manager instance
}
}
}
请注意,即使数据无效,我仍然需要显示主窗口并为用户写正确的消息。现在我看到两个选项:
在组合根我注册类
FileDataReader
,解析它的实例,检查它是否有效,如果是,注册TransmissionManager
,然后SampleViewModel
。然后应用程序可以正常进行。如果它无效,我注册另一个视图模型来处理错误消息等。我注册所有的类没有任何检查,在所有的类依赖于
FileDataManager
-如果它是无效的-我抛出InvalidArgumentException
。问题是,在哪里捕获它,记住,我必须向用户显示错误。
请帮我一下。也许你还有别的选择?
提前感谢。
编辑:我更新了类名并添加了另一个依赖项,这使情况变得复杂。
应用程序中的服务应该主要是无状态的。事实上,你的FileDataReader
可能处于有效或无效状态,这意味着你的设计有问题。
这里有一些其他的选项:
- 在启动时检查系统的有效性,如果读取的文件正确,则向用户显示警告。
- 用一个decorator来包装
FileDataReader
,该decorator捕获来自FileDataReader
的任何异常,并向用户显示一个明确的消息,解释'所选择的'文件已损坏。