C# 在向ServiceCollection注册singleton时获取类类型?

C# 在向ServiceCollection注册singleton时获取类类型?,c#,.net,C#,.net,我有一门课,比如 ConsoleLogger : ILogger 它需要传递给构造函数的类型 public ConsoleLogger(Type classType) 所以当把这行改成DI时,有点困难 private readonly ILogger Logger = new ConsoleLogger(GetType()); 如果我想将其注册到ServiceCollection,像这样,是否有方法传入该类型 sc.AddSingleton<ILogger, ConsoleLogge

我有一门课,比如

ConsoleLogger : ILogger
它需要传递给构造函数的类型

public ConsoleLogger(Type classType)
所以当把这行改成DI时,有点困难

private readonly ILogger Logger = new ConsoleLogger(GetType());
如果我想将其注册到ServiceCollection,像这样,是否有方法传入该类型

sc.AddSingleton<ILogger, ConsoleLogger>(provider =>
    new ConsoleLogger(GetType()) // not GetType() but the type  you're injecting into.
)
应该是这样的吗

sc.AddSingleton<ILogger, ConsoleLogger>(provider =>
    new ConsoleLogger(typeof(SomeClass))
)
sc.AddSingleton(提供程序=>
新控制台记录器(类型(SomeClass))
)

如果我能让它动态运行,那就太好了,有可能吗?

我认为有几种方法可以解决这个问题,每种方法都有各自的优点。您可以让类的签名明确表示实现需求。例如,
public SomeClass(ILogger logger)
您还可以传递记录器的工厂,例如
public SomeClass(ILogger loggerFactory)
。选项一没有修复任何问题,它不是动态的,我本来可以这样做的。第二个选项感觉很有希望,您是否有机会展示这种想法的代码示例?这实际上取决于您的日志记录方法和DI选择。有关如何使用Microsoft.Extensions.Logging执行此操作的文档位于
sc.AddSingleton<ILogger, ConsoleLogger>(provider =>
    new ConsoleLogger(typeof(SomeClass))
)