我有一個需要無參數構造函數的現有類。我想記錄一個錯誤和其中的一些其他數據。在我的應用程序的其他地方,我將ILoggerFactory
放在了我的構造函數中,而DI則負責處理它,因此我可以登錄等等。由於無參數構造函數的要求,在這種情況下我不能這樣做。如何在不使用依賴注入的情況下實例化ILoggerFactory?
我可以創建一個ILoggerFactory
或其他任何我從Startup類放入依賴注入流的類的實例嗎?
我有一個需要無參數構造函數的現有類。我想記錄一個錯誤和其中的一些其他數據。在我的應用程序的其他地方,我將ILoggerFactory
放在了我的構造函數中,而DI則負責處理它,因此我可以登錄等等。由於無參數構造函數的要求,在這種情況下我不能這樣做。如何在不使用依賴注入的情況下實例化ILoggerFactory?
我可以創建一個ILoggerFactory
或其他任何我從Startup類放入依賴注入流的類的實例嗎?
在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(這樣它將在這裏爲後代)被盜。
我實現了你所要求的,並且像這樣調用它:'var lf = ServiceInstantiator.Instance.GetService
@Grandizer你必須在''''之前添加'作爲ILoggerFactory'; – Nikolaus
這可能是一個缺少使用語句的情況,GetService <>方法實際上是擴展方法。 –
對於這樣的情況,你應該爲你現有的類註冊一個工廠類。讓它構造類,然後設置公共屬性或調用公共方法注入ILogger。 –
你如何使用課堂?你能爲ILoggerFactory定義一個公共屬性嗎?並從課外設置此屬性? – Nikolaus
@尼古拉斯我打算重寫這個類,使其不是如此獨立,並且可以「獲取」一個「ILoggerFactory」。 – Grandizer