带参数的 IoC 记录器
IoC logger with parameters
我目前正在研究 IoC 概念(使用 WPF 应用程序),但我还没有决定要使用它的工具,因为我仍在努力掌握它但我对如何针对每个组件的特定参数进行配置感到困惑。
我了解您如何在配置文件中定义相关库,以及它将如何确定应用程序应该使用哪个库以及它的生命周期应该是多久,但是每个库都需要自己的一组特定参数。
你从哪里得到这些,什么时候传递给他们的?
以您的典型记录器为例。
我有以下界面:
public interface ILogger
{
void Write(string message);
}
我有记录器 class 本身:
public class Logger : ILogger
{
private readonly ILogger _logger;
public Logger (ILogger logger)
{
_logger = logger;
}
public void Write(string message)
{
_logger.Write(message);
}
}
然后我定义了多个记录器,每个记录器都需要自己的参数,所以我实现了以下内容:
a) 数据库记录器: 其中需要连接字符串,以便我可以将消息记录到数据库中。
public void LoggerDb: ILogger
{
public void Write(string message)
{
}
public ConnectionString {get; set;}
}
b) 文件记录器: 其中需要文件名,以便我可以将我的消息记录到相关的日志文件中。
public void LoggerFile: ILogger
{
public void Write(string message)
{
}
public Filename {get; set;}
}
c) 控制台记录器: 其中不需要参数,因为我只想将消息输出到控制台 window.
public void LoggerConsole: ILogger
{
public void Write(string message)
{
}
}
在我的控制台测试应用程序中,我在 Program.cs 中有以下代码:
static void Main(string[] args)
{
string logTypeId = "d";
ILogger logType;
if (logTypeId == "d")
{
logType = new LoggerDb("Data Source=....");
}
else if (logTypeId == "f"
{
logType = new LoggerFile("c:\mylog.txt");
}
else
{
logType = new LoggerConsole();
}
Logger logger = new Logger(logType);
logger.Write("Message 1");
logger.Write("Message 2");
logger.Write("Message 3");
}
我知道这不是我使用 IoC 工具时代码的样子。我只是想强调我正在努力实现的目标,并试图获得以下问题的答案:
是否可以使用 IoC 工具来实现,即根据 app.config 的 IoC 部分中 used/defined 的记录器类型传递特定参数?
这是正确的方法吗,即让特定的记录器具有自己的构造函数参数?如果不是,您能否解释为什么以及正确的方法应该是什么。我不介意您使用的 IoC 工具。我只是想了解应该如何完成。
这些额外的参数应该存储在app.config?
的什么地方
首先,请注意,为了通过 IoC 实现 DI,绝不需要在配置文件中配置您的容器(尽管它当然是一个选项并且许多容器都支持它)。
现在大多数 IoC 容器还允许您在代码中指定您的设置。所以我想答案是:这实际上取决于您计划使用的 IoC 容器。我的意见:尽可能避免基于 xml 的配置;如果您问我,维护起来通常很痛苦,而且几乎没有价值。在基于代码的配置中,您仍然可以参考 app.config 或其他配置参数。
您也可以反过来问:是否需要将容器配置放在单独的文件中(为什么)?如果是,请寻找支持此功能的容器。但大多数都会。
使用基于代码的 DSL 的一些配置示例:
- Autofac 模块:http://docs.autofac.org/en/latest/configuration/modules.html
- 结构图:http://structuremap.github.io/registration/registry-dsl/
xml 配置的一些示例:
这取决于 ;)
- 我不能代表所有 DependencyInjection 工具,但其中许多应该支持此功能。
- 我没有看到任何反对这一点的言论。如果你想显式调用不同的 Loggers,你可以这样做。但您也可以使用某种 LogListeners。一个用于数据库,一个用于文件等等。而您的记录器只是将 LogMessage 委托给所有记录器。但这取决于您想要或需要什么 ;)
- 这也取决于记录器的实现。将 ConnectionString 存储在配置中很常见。其他参数太具体了,不过你也可以把它们存到config里。
我目前正在研究 IoC 概念(使用 WPF 应用程序),但我还没有决定要使用它的工具,因为我仍在努力掌握它但我对如何针对每个组件的特定参数进行配置感到困惑。
我了解您如何在配置文件中定义相关库,以及它将如何确定应用程序应该使用哪个库以及它的生命周期应该是多久,但是每个库都需要自己的一组特定参数。
你从哪里得到这些,什么时候传递给他们的?
以您的典型记录器为例。
我有以下界面:
public interface ILogger
{
void Write(string message);
}
我有记录器 class 本身:
public class Logger : ILogger
{
private readonly ILogger _logger;
public Logger (ILogger logger)
{
_logger = logger;
}
public void Write(string message)
{
_logger.Write(message);
}
}
然后我定义了多个记录器,每个记录器都需要自己的参数,所以我实现了以下内容:
a) 数据库记录器: 其中需要连接字符串,以便我可以将消息记录到数据库中。
public void LoggerDb: ILogger
{
public void Write(string message)
{
}
public ConnectionString {get; set;}
}
b) 文件记录器: 其中需要文件名,以便我可以将我的消息记录到相关的日志文件中。
public void LoggerFile: ILogger
{
public void Write(string message)
{
}
public Filename {get; set;}
}
c) 控制台记录器: 其中不需要参数,因为我只想将消息输出到控制台 window.
public void LoggerConsole: ILogger
{
public void Write(string message)
{
}
}
在我的控制台测试应用程序中,我在 Program.cs 中有以下代码:
static void Main(string[] args)
{
string logTypeId = "d";
ILogger logType;
if (logTypeId == "d")
{
logType = new LoggerDb("Data Source=....");
}
else if (logTypeId == "f"
{
logType = new LoggerFile("c:\mylog.txt");
}
else
{
logType = new LoggerConsole();
}
Logger logger = new Logger(logType);
logger.Write("Message 1");
logger.Write("Message 2");
logger.Write("Message 3");
}
我知道这不是我使用 IoC 工具时代码的样子。我只是想强调我正在努力实现的目标,并试图获得以下问题的答案:
是否可以使用 IoC 工具来实现,即根据 app.config 的 IoC 部分中 used/defined 的记录器类型传递特定参数?
这是正确的方法吗,即让特定的记录器具有自己的构造函数参数?如果不是,您能否解释为什么以及正确的方法应该是什么。我不介意您使用的 IoC 工具。我只是想了解应该如何完成。
这些额外的参数应该存储在app.config?
的什么地方
首先,请注意,为了通过 IoC 实现 DI,绝不需要在配置文件中配置您的容器(尽管它当然是一个选项并且许多容器都支持它)。
现在大多数 IoC 容器还允许您在代码中指定您的设置。所以我想答案是:这实际上取决于您计划使用的 IoC 容器。我的意见:尽可能避免基于 xml 的配置;如果您问我,维护起来通常很痛苦,而且几乎没有价值。在基于代码的配置中,您仍然可以参考 app.config 或其他配置参数。
您也可以反过来问:是否需要将容器配置放在单独的文件中(为什么)?如果是,请寻找支持此功能的容器。但大多数都会。
使用基于代码的 DSL 的一些配置示例:
- Autofac 模块:http://docs.autofac.org/en/latest/configuration/modules.html
- 结构图:http://structuremap.github.io/registration/registry-dsl/
xml 配置的一些示例:
这取决于 ;)
- 我不能代表所有 DependencyInjection 工具,但其中许多应该支持此功能。
- 我没有看到任何反对这一点的言论。如果你想显式调用不同的 Loggers,你可以这样做。但您也可以使用某种 LogListeners。一个用于数据库,一个用于文件等等。而您的记录器只是将 LogMessage 委托给所有记录器。但这取决于您想要或需要什么 ;)
- 这也取决于记录器的实现。将 ConnectionString 存储在配置中很常见。其他参数太具体了,不过你也可以把它们存到config里。