簡體   English   中英

使用Autofac作為服務定位器

[英]Using Autofac as a service locator

我正在使用Autofac來處理我的應用程序中的依賴注入。 但是,我有一個組件在運行時執行一些反射魔法,我不知道它在編譯時需要什么依賴項。

通常,我只是讓這個組件直接引用Container並解決它想要的任何問題。 但是,實例化此類的類沒有對Container的引用。

實際上,我的組件依賴於Autofac。 我更喜歡松散耦合,但這似乎不是一個選擇。 有沒有辦法問(在構造函數args中,或使用屬性注入,或其他什么!)Autofac給我一個對我的構造函數中的容器的引用? 或者,是否有一種更簡潔的方法讓Autofac為我提供可以解決任何問題的魔術服務定位器對象?

是的你可以。 只需依賴IComponentContext

public class MyComponent
{
    IComponentContext _context;
    public MyComponent(IComponentContext context)
    {
        _context = context;
    }

    public void DoStuff()
    {
        var service = _context.Resolve(...);
    }
}

從注釋更新:注入MyComponentIComponentContext取決於MyComponent解析范圍。 因此,重要的是要考慮MyComponent生命周期范圍。 例如,使用InstancePerLifetimeScope ,上下文將始終解析為依賴於MyComponent的服務所在的相同范圍。

假設你有兩個組件,A和B.

如果A在使用它之前需要知道關於B的X,那么這就是元數據詢問,並在這篇優秀文章中進行了描述。

此外,即使您無法使您的設計適應該帖子,您也應該再次嘗試確保是否確實需要將DI容器用作服務定位器。

在撰寫本文時,我能找到的最好的博客文章就是這篇文章

在其他情況下,如果未使用DI創建組件,則仍可以使用服務定位器模式。 CodePlex上的Common Service Locator庫非常適合此目的。

暫無
暫無

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

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