属性注入

属性注入允许在创建类依赖项后更新它们。如果你想简化对象创建,但仍允许使用测试双精度的测试覆盖依赖项,这将非常有用。

考虑一个需要在错误条件下写入日志文件的类。该类知道如何构造默认的 Logger,但允许通过属性注入来覆盖它。然而值得注意的是,使用属性注入这种方式,你将这个类紧密地耦合到 ILogger 的精确实现,在这个给定的例子中是 ConcreteLogger。可能的解决方法可能是返回所需 ILogger 实现的工厂。

public class RecordProcessor
{
    public RecordProcessor()
    {
        Logger = new ConcreteLogger();
    }

    public ILogger Logger { get; set; }

    public void DoSomeProcessing()
    {
        // ...
        _logger.Log("Complete");
    }
}

在大多数情况下,构造函数注入优于 Property Injection,因为它在构造后立即提供了对对象状态的更好保证。