2015-05-25 36 views
2

在Unity3D簡單的注射器1我想結合使用簡單的注射器V1.6Unity3D遊戲引擎(V5.0)。
我需要使用物業注射因爲Unity3D擁有組裝控制,不會讓構造器注入,因爲(多麼不幸可能),這只是方式Unity3D的API 目前。物業注射下.NET 3.5

Unity3D目標的腳本組件,以.NET 3.5,所以這意味着System.ComponontModel.Composition不可用,從而導致作爲在簡單注射器documentation描述我無法用明確的財產注入。

所以我到簡單的噴油器的開發者(S)的問題是:「有沒有利用財產注入了由Unity3D引擎控制類的任何其他方式?'。

+0

就我個人而言,我不確定_DI_或其變體是否考慮到它們通常會帶來的性能開銷的遊戲的好主意。 – MickyD

+1

@MickyDuncan您的評論並不在我的問題範圍內。這個話題是完全不同的討論,與我的問題無關。 – QuantumHive

+0

@MickyDuncan,表現無關緊要。無論如何,你的對象圖應該由單例構成,這使得解析對象圖的性能成爲一個非問題。 – Steven

回答

3

簡單噴射器的默認行爲可以通過多種方式擴展屬性注入,但最好的方法是像here所解釋的那樣覆蓋簡單噴射器的PropertyInjectionBehavior。

你說構造函數注入不是一個選項。這表明攔截創建一些框架類型是不可能的。 Unity3d框架在這裏控制。

在這種情況下,您將不得不讓Simple Injector建立現有類型。從來沒有一個最佳的情況,但你可能做的很少。 This wiki page描述瞭如何讓Simple Injector構建外部實例。

UPDATE

上面的答案是具體到簡單的注射器V2。 Simple Injector v2獲得了許多新的引人注目的功能,例如用於啓用屬性注入的IPropertySelectionBehavior抽象,允許構建外部實例的Registration類以及允許攔截創建類型以允許注入屬性或字段的ExpressionBuilding事件。

Simple Injector v2然而需要.NET 4.0,所以這意味着使用v2不適合你,因爲你需要.NET 3.5。所有這些功能在Simple Inject v1中都不可用,所以上面的答案對您沒有意義。

剩下的唯一選擇是使用Container.InjectProperties(object)方法來允許在外部創建的實例上隱式注入屬性。

然而,隱式屬性注入有許多缺點,如here所述。這就是爲什麼InjectProperties方法自v2.6開始被標記爲[Obsolete]的原因。原因如下here。由於這裏描述的原因,Simple Injector v3甚至不包括InjectProperties方法。

所以你唯一的選擇是使用InjectProperties方法來建立你的對象,但請閱讀引用的文章,以瞭解使用隱式屬性注入的風險是什麼。瞭解風險可以讓您做出明智的決定,判斷這對您是否有風險,並允許您採取反措施,例如編寫額外的單元測試。

一個完全不同的選擇,可能是使用Humble Objects。這意味着什麼,而不是迴歸屬性注入,你需要使用盡可能小的代碼儘可能小地創建Unity3D創建的類。您將所有有趣的邏輯及其所有依賴關係移動到可應用構造函數注入的自定義組件中。在剝離下來的'謙虛'類中,你只需解析新創建的組件並使用它。

這使您可以在涉及到依賴注入時應用最佳實踐,而不必回退到醜陋的屬性注入,同時將不可測代碼保持在絕對最小值。