我使用的是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){....}' –