2014-02-09 30 views
1

代碼取自from。 Unity應解析Account類型的所有命名註冊並將它們放入通用數組中。但由於某種原因Account依賴關係未解析,因此注入的通用數組爲空。爲什麼數組不填充?注入的通用數組不包含任何組件

container.RegisterType<Account>("first"); 
    container.RegisterInstance<Account>("second", new Account()); 

    container.RegisterType(
     typeof(MyClass<>), 
     new InjectionConstructor(
      new GenericResolvedArrayParameter("T"))); 

    var myClass = container.Resolve<MyClass<Account>>(); 
    Console.WriteLine(myClass.InjectedValue.Length); // 0 

public class Account 
{ } 

public class MyClass<T> 
{ 
    public T[] injectedValue; 

    public MyClass(T[] injectedValue) 
    { 
     this.InjectedValue = injectedValue; 
    } 

    public T[] InjectedValue 
    { 
     get { return this.injectedValue; } 
     set { this.injectedValue = value; } 
    } 
} 

感謝

+0

避免「乞求bug」,特別是在標題中。 – user2864740

+0

爲什麼會/應該數組有*任何*大小,少得多*任何*非空值?也就是說,上面的規則會讓Unity知道*注入數組的內容是什麼? – user2864740

+0

@ user2864740:如果Account []類型的數組是非通用的,那麼Unity將爲每個註冊的Account類型創建一個實例並將它們注入到該數組中。根據我包含的鏈接,當數組是通用的 – bckpwrld

回答

1

您使用將只是幫助統一選擇一個構造函數一個泛型參數T的代碼。但是它不能告訴提供哪些實例。

您可以使用GenericResolvedArrayParameter來指定要在注射作爲命名實例:

var container = new UnityContainer(); 
container.RegisterType<Account>("first"); 
container.RegisterInstance<Account>("second", new Account()); 

container.RegisterType(
    typeof(MyClass<>), 
    new InjectionConstructor(
     new GenericResolvedArrayParameter(
      "T", 
      new GenericParameter("T", "first"), 
      new GenericParameter("T", "second")))); 

然而,這是有點麻煩,只有真正有用的,如果你有多個構造函數(如你指定哪個構造函數應該統一使用),或者只是想傳遞一些指定的註冊(就像手動包含它們一樣)。幸運的是,Unity默認情況下理解數組,並將提供所有命名實例。所以,如果你有一個構造函數取T[]你並不需要在所有的MyClass註冊(因爲它是一個具體類型):

var container = new UnityContainer(); 
container.RegisterType<Account>("first"); 
container.RegisterInstance<Account>("second", new Account()); 
var defaultInstance = new Account(); 
container.RegisterInstance<Account>(defaultInstance); 

如果這樣做的,你可以嘗試解決MyClass<Account>和你會看到名爲註冊「第一」和「第二」被注入。

var myClass = container.Resolve<MyClass<Account>>(); 
//myClass.injectedValue contains 2 items, from registrations "first" and "second" 
//default (unnamed) registration is skipped 

如果不是與T[]你有另一種枚舉類型就像IEnumerable<T>數組參數的構造函數,你仍然可以使用這個最後一種方法。添加另一登記,告訴統一如何從陣列到所需的枚舉類型映射:

container.RegisterType<IEnumerable<Account>,Account[]>(); 

我已經創建this fiddle測試4點的方法。 希望瞭解這些選項如何工作會很有用。

+0

謝謝時,應該發生同樣的事情。我沒有意識到這段代碼只是爲了演示如何選擇構造函數。我認爲它也應該用已解決的命名註冊填滿陣列。但是,再讀一遍,閱讀那篇文章就像是拉扯牙齒 – bckpwrld

+0

是的,那篇文章很難遵循! [Unity 3](http://msdn.microsoft.com/en-us/library/dn170416.aspx)的msdn條目稍好或至少更容易遵循。我也忘了提及,如果您只想將一些指定的註冊傳遞到數組中,您最初的代碼也會很有用(我更新了包含該註釋的答案) –

相關問題