2015-09-07 26 views
0

我在容器中註冊了一些服務。還有一些對此服務有依賴性的類型短暫的生存論點。例如:在Simple Injector中生成Func <TParam1,TParam2,TService>工廠

public class Foo 
{ 
    public Foo(IService1 svc1, IService2 svc2, int entityId) { } 
} 

我想要的是某種方式來自動生成工廠創建這樣的對象,而無需手動編碼每個工廠。我可以使用Func<int, Foo>或創建一些IFooFactory(與CreateFoo(int entityId)方法),我想讓簡單注入器自動生成此工廠的實現(以任何數量的參數通用的方式)。

可能嗎?

+0

您能否爲我們提供更多關於這個班級'Foo'的內容。這是什麼類?這是一個實體嗎,比如'Customer'或'Order'? – Steven

+0

目前我只是想了解是否有可能在SimpleInjector(這樣的功能)或不。例如,AutoFac支持Func <..>的這種功能 - http://autofac.readthedocs.org/en/latest/advanced/delegate-factories.html。考慮到方法注入 - 在這種情況下,所有的依賴都是明確的。如果將添加一些依賴關係 - 我將需要更改此方法的所有調用。我可以避免它嗎? – oryol

+0

作爲一個例子 - 我想有一些MessageProcessor這有幾種方法來處理消息和幾個依賴關係,但只有具體信息工程(我不想給它一次又一次地通過在每一個方法) – oryol

回答

1

看看SimpleInjector github頁面上的AutomaticParameterizedFactoryExtensionsTests class。它有一個測試方法,解釋瞭如何使用AutomaticParameterizedFactoryExtensions,這似乎是你所要求的。

該類位於源代碼中的SimpleInjector.CodeSamples項目中。

+0

是啊,看起來像這樣的樣品做。不幸的是,我沒有找到,這就是爲什麼我問這個問題在文件中這樣的例子。謝謝。 – oryol

+0

的原因,這是不是文檔中bevause我們要從這樣鼓勵開發者。 – Steven

2

DI庫的構建是爲了創建長期服務的對象圖。你試圖濫用你的容器來建立一個短暫的課程。像實體,消息和DTO這樣的短期對象通常被稱爲newables,因爲您應該手動新建它們,並且不要讓您的合成根或容器爲您自動連線它們。

如果這個Foo是一個實體,依賴關係should not be injected into the entity's constructor。應該使用方法注入;一個實體具有多個域方法,並且這些方法應該指定它們所需的依賴關係。調用該域方法的組件可以將這些依賴注入到其構造函數中。在運行時,可以將這些依賴關係傳遞給實體的方法。

將運行時數據與編譯時間依賴關係混合到類的構造函數中有許多缺點。例如,它使您的對象圖很難驗證,這當然適用於注入Func<TParam1, TParam2, Entity>。以一個類爲例,該類帶有兩個相同類型的參數,例如public Bar(IService1, int a, int b)以及注入消費者的相應Func<int, int, Bar>方法。但如果Bar更改爲public Bar(IService1, int b, int a)(與ab交換)?在這種情況下,代碼將在運行時失敗;編譯器和我們的DI庫都無法爲我們檢測到這一點。

相關問題