请考虑以下情况:有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
。问题是,在哪里抓住它,请记住,我必须向用户显示错误。
请帮我解决这个问题。也许你还有其他选择吗?
提前致谢。
编辑:我更新了类名并添加了另一个依赖项,这使情况复杂化。
答案 0 :(得分:1)
您的应用程序中的服务应主要是无状态的。您的FileDataReader
可能处于有效或无效状态这一事实意味着您的设计存在问题。
以下是其他一些选项:
FileDataReader
,该装饰器捕获来自FileDataReader
的任何异常,并向用户显示明确的消息,说明他们选择了'文件已损坏。