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

时间:2014-07-29 12:51:57

标签: c# dependency-injection

请考虑以下情况:有SampleViewModel课,这取决于班级FileDataReaderTransmissionManagerTransmissionManager也依赖于FileDataReader),其中FileDataReader可以处于两种状态 - 有效或无效。无效状态意味着无法使用此实例(它从文件中读取数据,如果此文件被解除状态更改为无效)。如果没有FileDataReaderSampleViewModelTransmissionManager的实例也无用,因为这种依赖关系至关重要。我应该如何编写将这三个类连接在一起的正确代码?

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。问题是,在哪里抓住它,请记住,我必须向用户显示错误。

  3. 请帮我解决这个问题。也许你还有其他选择吗?

    提前致谢。

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

1 个答案:

答案 0 :(得分:1)

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

以下是其他一些选项:

  1. 在启动期间检查系统的有效性,如果读取的文件正确,则向用户显示警告。
  2. 使用装扮器包裹FileDataReader,该装饰器捕获来自FileDataReader的任何异常,并向用户显示明确的消息,说明他们选择了'文件已损坏。