2017-09-23 853 views
2

我有一個需要無參數構造函數的現有類。我想記錄一個錯誤和其中的一些其他數據。在我的應用程序的其他地方,我將ILoggerFactory放在了我的構造函數中,而DI則負責處理它,因此我可以登錄等等。由於無參數構造函數的要求,在這種情況下我不能這樣做。如何在不使用依賴注入的情況下實例化ILoggerFactory?

我可以創建一個ILoggerFactory或其他任何我從Startup類放入依賴注入流的類的實例嗎?

+4

對於這樣的情況,你應該爲你現有的類註冊一個工廠類。讓它構造類,然後設置公共屬性或調用公共方法注入ILogger。 –

+0

你如何使用課堂?你能爲ILoggerFactory定義一個公共屬性嗎?並從課外設置此屬性? – Nikolaus

+0

@尼古拉斯我打算重寫這個類,使其不是如此獨立,並且可以「獲取」一個「ILoggerFactory」。 – Grandizer

回答

2

在Configure中(在Startup.cs中),您將獲得傳入的IApplicationBuilder,它具有ApplicationServices屬性(IServiceProvider)。

您可以輕鬆地做類似

public void Configure(IApplicationBuilder app) 
{ 
    GetMeSomeServiceLocator.Instance = app.ApplicationServices; 
} 

public static class GetMeSomeServiceLocator 
{ 
    public static IServiceProvider Instance { get; set; } 
} 

再後來,某處完全無關,做

public void SomeRandomMethod() 
{ 
    var service = GetMeSomeServiceLocator.Instance.GetService<MyAwesomeService>(); 

    // Do something with service 
} 

這是一個可怕的反模式,你永遠不應該這樣做,雖然。

無恥地從https://github.com/aspnet/DependencyInjection/issues/294(這樣它將在這裏爲後代)被盜。

+0

我實現了你所要求的,並且像這樣調用它:'var lf = ServiceInstantiator.Instance.GetService ();'但是獲取錯誤'非泛型方法IServiceProvider.GetService(Type)不能與類型參數一起使用'。然而,這個'var lf = ServiceInstantiator.Instance.GetService(typeof(ILoggerFactory))'編譯,但是我不能這樣做:'lf.CreateLogger ();' – Grandizer

+0

@Grandizer你必須在''''之前添加'作爲ILoggerFactory'; – Nikolaus

+2

這可能是一個缺少使用語句的情況,GetService <>方法實際上是擴展方法。 –

相關問題