我使用的是ASP.NET Core,我知道這樣的日誌記錄機制已經由框架提供,但是使用它來說明我的問題。因爲我不知道日誌類型(因爲它存儲在數據庫中),所以我使用了一種Factory模式來構建Logger類。在ASP.NET中使用依賴注入和工廠模式傳遞服務
的ILogger合同
Log(string msg)
隨後的LoggerFactory將根據PARAM從DB通過創建一個記錄器後返回ILogger:
public class LoggerFactory
{
public static Contracts.ILogger BuildLogger(LogType type)
{
return GetLogger(type);
}
//other code is omitted, GetLogger will return an implementation of the related logger
現在,當我需要使用Logger我要這樣做:
public class MyService
{
private ILogger _logger
public MyService()
{
_logger = LoggerFactory.BuildLogger("myType");
}
但是,我打算讓我的課沒有任何insta ntiation,我需要使用構造DI爲MyService中,我需要注入在啓動時所有的依賴:
services.AddTransient<Contracts.ILogger, LoggerFactory.BuildLogger("param") >();
但是這不會工作,這一點,我們需要通過一個具體的實現。 如何使用DI進行這項工作,是否有更好的方法來實現?
一種選擇是注入'LoggerFactory',而不是'ILogger'。通過這種方式,您可以獲得LoggerFactory,從數據庫獲取Type並構建您的ILogger。如果你想注射ILogger,你必須知道注射時刻你的ILogger的類型。但是你可能還沒有這個信息。 –
您的意思是在MyService構造函數中傳遞LoggerFactory,並且不要將其添加到.net核心服務 – Coding
是的。像這樣:'services.AddSingleton();'。 Singleton意味着你只會在第一次需要的時候創建一個LoggerFactory對象。在此之後,您將只使用相同的。然後,像這樣使用:'public MyService(LoggerFactory loggerFactory){....}' –