属性注入允许在创建类依赖关系后对其进行更新。如果要简化对象创建,但是仍然允许测试双精度测试覆盖依赖项,这可能很有用。
考虑一个需要在错误情况下写入日志文件的类。该类知道如何构造一个default Logger,但是允许通过属性注入覆盖它。但是,值得注意的ILogger是,ConcreteLogger在这种给定的示例中,以这种方式使用属性注入将使该类与该类的确切实现紧密结合。可能的解决方法是返回所需ILogger实现的工厂。
public class RecordProcessor { public RecordProcessor() { Logger = new ConcreteLogger(); } public ILogger Logger { get; set; } public void DoSomeProcessing() { // ... _logger.Log("Complete"); } }
在大多数情况下,构造器注入优于属性注入,因为它可以在构造对象后立即提供关于对象状态的更好保证。