2014-09-22 41 views

回答

6

InjectProperties標記爲[Obsolete]屬性,編譯器消息指向的URL爲https://simpleinjector.org/depr1,它提供了更詳細的信息。被引用的頁面解釋了爲什麼不推薦使用此方法以及如何更改您的代碼或配置。

該頁面還鏈接到Property Injection paragraph of the Extendibility Points page。本頁描述如何配置容器以啓用屬性注入。例如:

class PropertySelectionBehavior<TAttribute> : IPropertySelectionBehavior 
    where TAttribute : Attribute 
{ 
    public bool SelectProperty(Type type, PropertyInfo prop) { 
     return prop.GetCustomAttributes(typeof(TAttribute)).Any(); 
    } 
} 

// Usage: 
var container = new Container(); 
container.Options.PropertySelectionBehavior = 
    new PropertySelectionBehavior<MyInjectAttribute>(); 

這使容器注入與該[MyInject]屬性明確標記屬性。

如果可能,請始終嘗試讓容器爲您創建類型,而不是使用默認構造函數的類型,然後注入屬性。然而我不熟悉Caliburn Micro,我不確定這是否可行。

如果您需要BuildUp類似的行爲,您可以從容器中檢索註冊並請求它爲您初始化現有實例。這將如下所示:

public void BuildUp(object instance) 
{ 
    var registration = this.container.GetRegistration(instance.GetType(), true); 
    registration.Registration.InitializeInstance(instance); 
} 

這允許容器初始化實例和通過Simple Injector pipeline這使得能夠根據給出的給定的登記和配置規則(如顯式屬性注射示例性噴射和其他初始化發送它以上)。

如果需要構建的類型具有默認的構造函數,這會很好用。如果不是這種情況,您必須創建(並緩存)一個新的Registration實例,調用Lifestyle.Transient.CreateRegistration並在該實例上調用InitializeInstance,就像MVC集成包的SimpleInjectorFilterAttributeFilterProvider一樣(您可以看看它的源代碼代碼here)。

+0

感謝史蒂文那快速的迴應。我實際上讀過這個鏈接,但不知道如何運行通過容器管道在容器外部創建的實例。 – 2014-09-22 11:48:55

+0

雖然我有點擔心,有沒有在容器中註冊的類型正在使用 - 只有它們的屬性。這一切都在框架內,我不確定內部工作原理... – 2014-09-22 11:51:41

+0

@MarkusHütter:我對Caliburn和WPF沒有經驗,並且不確定在這裏提出什麼建議。你能否更新你的問題:給我一個鏈接到一些在線資源的鏈接,說明哪些類型需要「建立」以及它們是如何使用的? – Steven 2014-09-22 11:56:53