2017-01-09 75 views
0

如果我使用Autofac使用Property注入,Autofac将在创建异议时在构造函数注入解析时访问属性(使用getter方法)时解析它,因此我们可以说使用Autofac的属性注入是Lazy。使用Autofac时属性注入是否懒惰?

请确认我的理解。

问候, 拉什

+1

你真的问这个问题之前尝试在单元测试或代码的形式什么?你有没有寻找任何现有的文件? –

回答

3

物业注入更是不可以偷懒。当拥有它们的服务将从容器中解析时,属性将被设置。

举一个例子,其中一个类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 
+0

重要的是要注意*属性注入*导致[时间耦合](http://blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling/),因为在几乎所有情况下,*构造函数注入*是一个更好的选择。 – Steven