【问题标题】:Is property injection lazy when using Autofac?使用 Autofac 时属性注入是否懒惰?
【发布时间】:2017-01-11 02:09:17
【问题描述】:

如果我使用 Autofac 使用属性注入,那么 Autofac 将在访问属性时解决它(使用 getter 方法),而构造函数注入在创建反对时解决,所以我们可以说使用 Autofac 的属性注入是惰性的。

请确认我的理解。

问候, 拉什

【问题讨论】:

  • 在问这个问题之前,你真的尝试过单元测试或代码的形式吗?您是否查找过任何现有文档?

标签: dependency-injection autofac


【解决方案1】:

属性注入不是懒惰的。当拥有它们的服务将从容器中解析时,将设置属性。

以这个例子为例,一个类Service包含一个Dependency类型的属性。 我们在不同的时间登录:

  • Service 从容器中解析之前
  • Service 从容器中解析后
  • Service 的已解析实例访问Dependency 属性时
  • 在设置Service 类的Dependency 属性时
class Program
{
    private static int _logCount = 1;

    public static void Log(string message)
    {
        Console.WriteLine($"[{_logCount}]: {message}");
        _logCount += 1;
    }

    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();

        builder
            .RegisterType<Dependency>()
            .AsSelf();

        builder
            .RegisterType<Service>()
            .AsSelf()
            .PropertiesAutowired();

        var container = builder.Build();

        Log("Before resolving Service");
        var service = container.Resolve<Service>();
        Log("After resolving Service");

        Log("Accessing the Dependency property");
        var dependency = service.Dependency;

        Console.ReadLine();
    }
}

public class Service
{
    private Dependency _dependency;

    public Dependency Dependency
    {
        get { return _dependency; }
        set {
            Program.Log("Dependency is being injected");
            _dependency = value;
        }
    }
}

public class Dependency
{
}

这是输出:

[1]: Before resolving Service
[2]: Dependency is being injected
[3]: After resolving Service
[4]: Accessing the Dependency property

【讨论】:

  • 重要的是要注意 Property Injection 会导致 Temporal Coupling,因此在几乎所有情况下,Constructor Injection 是一个更好的选择.
猜你喜欢
  • 2017-01-26
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2013-01-03
  • 2012-09-21
  • 1970-01-01
相关资源
最近更新 更多