簡體   English   中英

具有多個容器的.NET反射依賴注入

[英].NET Reflective Dependency Injection with Multiple Containers

我對依賴注入還比較陌生,因此在某種程度上我可能對此概念有所保留。 但是,我正在嘗試實現以下目標,但是不確定是否可行:

可以說我有兩個容器,每個容器包含相同類型的依賴關系的不同實例。 例如,每個都包含MyApplicationContextMyRequestContext的不同單個實例。

現在讓我說我有幾個類依賴於這些實例中的一個(或兩個)。 他們不應該擔心使用的是兩個容器中的哪個; 他們只需要依賴項的實例即可完成工作。

在理想情況下,這些可靠類中的每一個都在其構造函數中進行靜態調用,從而反過來從適當的容器中注入依賴項...

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM