如何编写依赖项的条件注入

本文关键字:条件 注入 何编写 依赖 | 更新日期: 2023-09-27 18:15:29

请考虑以下情况:存在类SampleViewModel,它依赖于类FileDataReaderTransmissionManager (TransmissionManager也依赖于类FileDataReader),其中FileDataReader可以处于有效或无效两种状态。无效状态意味着这个实例不能被使用(它从文件中读取数据,如果这个文件被损坏,状态变为无效)。没有FileDataReader, SampleViewModelTransmissionManager的实例也是无用的,因为这个依赖关系是至关重要的。我应该如何编写合适的代码将这三个类连接在一起?

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
        }
    }
}

请注意,即使数据无效,我仍然需要显示主窗口并为用户写正确的消息。现在我看到两个选项:

  1. 在组合根我注册类FileDataReader,解析它的实例,检查它是否有效,如果是,注册TransmissionManager,然后SampleViewModel。然后应用程序可以正常进行。如果它无效,我注册另一个视图模型来处理错误消息等。

  2. 我注册所有的类没有任何检查,在所有的类依赖于FileDataManager -如果它是无效的-我抛出InvalidArgumentException。问题是,在哪里捕获它,记住,我必须向用户显示错误。

请帮我一下。也许你还有别的选择?

提前感谢。

编辑:我更新了类名并添加了另一个依赖项,这使情况变得复杂。

如何编写依赖项的条件注入

应用程序中的服务应该主要是无状态的。事实上,你的FileDataReader可能处于有效或无效状态,这意味着你的设计有问题。

这里有一些其他的选项:

  1. 在启动时检查系统的有效性,如果读取的文件正确,则向用户显示警告。
  2. 用一个decorator来包装FileDataReader,该decorator捕获来自FileDataReader的任何异常,并向用户显示一个明确的消息,解释'所选择的'文件已损坏。