【发布时间】:2017-03-23 15:24:47
【问题描述】:
我使用的是 ASP.NET Core,我知道框架已经提供了这样的 Logging 机制,但是用这个来说明我的问题。
我正在使用一种工厂模式来构建 Logger 类,因为我不知道日志记录的类型(因为它存储在 DB 中)。
ILogger 合同
Log(string msg)
那么LoggerFactory会根据DB传入的参数创建Logger后返回一个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");
}
但是,我打算保留我的类而不进行任何实例化,我需要在 MyService 中使用 Constructor DI,并且我需要在 Startup 上注入所有依赖项:
services.AddTransient<Contracts.ILogger, LoggerFactory.BuildLogger("param") > ();
但这行不通,我们需要通过一个具体的实现。 如何使用 DI 来完成这项工作,有没有更好的方法来实现它?
【问题讨论】:
-
一种选择是注入
LoggerFactory,而不是ILogger。这样,您将获得 LoggerFactory,从您的 DB 中获取类型并构建您的 ILogger。如果要注入 ILogger,则必须在注入时知道 ILogger 的类型。但您可能还没有此信息。 -
您的意思是在 MyService 构造函数中传递 LoggerFactory 并且不要将其添加到 .net 核心服务中
-
是的。像这样:
services.AddSingleton<LoggerFactory>();。单例意味着您将仅在第一次需要时创建 LoggerFactory 对象。在此之后,您将只使用相同的。然后,你可以这样使用:public MyService(LoggerFactory loggerFactory) {....}
标签: c# asp.net-mvc dependency-injection asp.net-core factory-pattern