2017-01-09 74 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