【发布时间】:2016-09-29 09:16:06
【问题描述】:
我目前正在使用 IoC 概念(使用 WPF 应用程序),我还没有决定要使用的工具,因为我仍在努力掌握它,但我'对于如何配置每个组件的特定参数感到困惑。
我了解您如何在配置文件中定义相关库,以及它将如何确定应用应该使用哪个库以及它的生命周期应该是多少,但是每个库需要自己的一组特定参数。
你从哪里得到这些,你什么时候传递它们?
以您的典型记录器为例。
我有如下界面:
public interface ILogger
{
void Write(string message);
}
我有记录器类本身:
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) 控制台记录器: 不需要任何参数,因为我只想将消息输出到控制台窗口。
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 部分中使用/定义的记录器类型传递特定参数?
这是正确的方法,即拥有具有自己构造函数参数的特定记录器吗?如果不是,你能解释一下为什么以及什么应该是正确的方法。我不介意您使用的 IoC 工具。我只是想了解这应该怎么做。
这些附加参数应该存储在 app.config 中的什么位置?
【问题讨论】:
-
“我知道如果我使用 IoC 工具,代码将不会是这样。”这是不正确的。即使您使用 DI 库,您所做的是一种有效的方法。您的
Main方法是Composition Root,您还可以在此处配置DI 库。在使用 DI 库的情况下,您的代码可能看起来完全一样。
标签: c# dependency-injection inversion-of-control ioc-container