簡體   English   中英

如何將Unity與內部類一起使用?

[英]How can I use Unity with internal classes?

我有一個Web API應用程序,並使用Unity進行依賴注入。 該應用程序使用包含Interface IDoStuff的庫和實現該接口的類:

internal interface IDoStuff
{
    void DoSomething();
}

internal class DoStuff : IDoStuff
{
    public void DoSomething()
    {
        // Do some stuff
    }
}

該庫還有一個需要做的事情的公共類:

public class NeedToDoStuff
{
    private IDoStuff doStuff;

    public NeedToDoStuff()
    {
        this.doStuff = new DoStuff();
    }

    internal NeedToDoStuff(IDoStuff doStuff)
    {
        this.doStuff = doStuff;
    }

    void PleaseDoStuff()
    {
        doStuff.DoSomething();
    }
}

我想使用Unity在我的控制器中創建一個NeedToDoStuff實例,並負責在內部創建DoStuff類,而不是直接調用new的構造函數。 但是,我能看到的唯一方法是將IDoStuff接口和DoStuff類都公開,這對我來說似乎是錯誤的。 這似乎是錯誤的,因為這些是實現細節,只與庫本身相關。 我通過控制反轉得到了你允許頂級應用程序通過某種配置對其底層實現做出選擇,但是這是否意味着不再需要內部等?

忘記你正在使用容器,讓我們說你自己在應用程序的啟動路徑創建這些類 你怎么在C#中實際做到這一點?

答案是,你做不到。 這不會在C#中編譯,因為C#要求這些類型是公共的。 因此,雖然這些類型可能是其他組件的實現細節,但它們並不是應用程序將它們連接在一起的實現細節。 你是否使用DI庫來幫助你是無關緊要的; 該庫需要訪問這些庫,因為對於庫,這些類不是實現細節。

並注意隱藏這些類有不同的方法。 您可以將接口移動到它們自己的程序集中,讓消費庫和包含這些實現的庫都依賴於新的“契約”程序集。 如果不讓使用程序集依賴於實現程序集,則實現類型會從使用程序集中有效隱藏,即使這些類型仍然是公共的。

雖然我個人反對內部接口,但您可以通過添加允許團結使用它們

[assembly: InternalsVisibleTo("Unity_ILEmit_InterfaceProxies")] 

到包含您的接口的項目的AssemblyInfo.cs文件。 我在嘗試添加[assembly:InternalsVisibleTo(“Microsoft.Practices.Unity”)]之后發現了這個,我看到它在其他帖子中沒有用,並且沒有效果,但覺得這是正確的方向。 我從代碼中提取的堆棧跟蹤引用了上面的程序集並允許代碼工作。

這將允許您隱藏您的接口。 構造函數是另一個故事。

我發布了自己的答案,因為我認為它最接近於回答我原來的問題。 它可能不像Steven的建議那樣干凈,但是喜歡或討厭它,它確實允許庫的內部類與Unity結合使用。

我需要對類/接口進行三次更新:

  1. 使接口公開。
  2. 使構造函數公開。
  3. 引入一個靜態類/方法,在庫中執行統一注冊,從應用程序啟動時執行的主統一注冊邏輯調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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