![](/img/trans.png)
[英]No output when using multiple dependency injection containers with NLog
[英].NET Reflective Dependency Injection with Multiple Containers
我對依賴注入還比較陌生,因此在某種程度上我可能對此概念有所保留。 但是,我正在嘗試實現以下目標,但是不確定是否可行:
可以說我有兩個容器,每個容器包含相同類型的依賴關系的不同實例。 例如,每個都包含MyApplicationContext
和MyRequestContext
的不同單個實例。
現在讓我說我有幾個類依賴於這些實例中的一個(或兩個)。 他們不應該擔心使用的是兩個容器中的哪個; 他們只需要依賴項的實例即可完成工作。
在理想情況下,這些可靠類中的每一個都在其構造函數中進行靜態調用,從而反過來從適當的容器中注入依賴項...
public class MyDependableClass{
protected MyApplicationContext Application {get; set;}
protected MyRequestContext Request {get; set;}
public MyDependableClass() {
Dependencies.Inject(this);
}
}
但是,AFAIK沒有確定合適容器的實用方法。 我已經考慮過將每個對象注冊到一個特定的容器(例如container.Register(obj);
),但這會很費力,並且如果構造函數中需要依賴項,將無法正常工作。 或者,您可以分析調用堆棧以從已注冊的頂級對象推斷容器……不適用於異步調用等
有任何想法嗎?
示例:我可能有幾個類,它們可能取決於代理的實例。 我們稱之為ILogicProxy
。 該代理可以將呼叫轉發到另一台計算機上的本地邏輯或遠程邏輯。 此外,該應用程序可以與多個遠程計算機建立連接。 所以...我們可能有多個ILogicProxy
實例,需要將它們注入幾個類中……但是哪一個去了哪里呢? 像這樣的解決方案可以只使用簡單的“ setter屬性注入”,但是當需要更多依賴項時,這種解決方案就無法擴展,因為這將導致“接線”過程變得混亂/冗長。
多個容器不是這種情況。 使用容器配置進行連接。 如果您在ILogicProxy
接口下注冊了大量組件,那么可以,您將不得不進行更多的手動接線。 但是請問問自己,這些組件是否應該在同一接口下真正注冊。
關於代碼示例:
在理想情況下,這些可靠類中的每一個都會在其構造函數中進行靜態調用,從而反過來從適當的容器中注入依賴項...
public class MyDependableClass{
protected MyApplicationContext Application {get; set;}
protected MyRequestContext Request {get; set;}
public MyDependableClass() {
Dependencies.Inject(this);
}
}
這是服務位置,而不是依賴項注入。 始終喜歡依賴注入而不是服務位置。 盡量不要依賴組件中的Resolve()或Inject()方法。
在我看來,您不需要多個容器,但是您必須創建一個知道如何路由的ILogicProxy
實現。 您也許可以將該類型實現為其他ILogicProxy
實現的包裝器,如下所示:
public class LogicProxyRouter : ILogicProxy
{
private readonly ILogicProxy local;
private readonly ILogicProxy remote;
public LogicProxyRouter(ILogicProxy local, ILogicProxy remote)
{
this.local = local;
this.remote = remote;
}
public void Method(params)
{
if (someCondition)
{
this.local.Method(params);
}
else
{
this.remote.Method(params);
}
}
}
這樣,您可以像這樣連接單個實例:
ILogicProxy proxy =
new LogicProxyRouter(new LocalLogicProxy(), new RemoteLogicProxy());
// Register that instance in your favorite IoC framework
container.RegisterSingle<ILogicProxy>(proxy);
我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.