带参数

时间:2016-09-29 09:16:07

标签: c# dependency-injection inversion-of-control ioc-container

我目前正在玩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工具,这不是代码的方式。我只是想突出我想要实现的目标,并且我试图回答以下问题:

  1. 是否可以使用IoC工具实现,即根据app.config的IoC部分中使用/定义的记录器类型传递特定参数?

  2. 这是正确的方法,即具有自己的构造函数参数的特定记录器吗?如果没有,你能解释为什么以及什么应该是正确的方法。我不介意你使用的IoC工具。我只是想了解应该如何做到这一点。

  3. 这些附加参数应该存储在app.config中吗?

2 个答案:

答案 0 :(得分:2)

首先,请注意,为了通过IoC实现DI,不需要在配置文件中配置容器(尽管它当然是一个选项,许多容器都支持它)。

目前,大多数IoC容器还允许您在代码中指定设置。所以我猜答案是:它实际上取决于您计划使用的IoC容器。我的意见:如果可以,请避免使用基于xml的配置;如果你问我,维护往往是一种痛苦而且带来的价值很小。在基于代码的配置中,您仍然可以从app.config或其他参考配置参数。

您还可以解决问题:是否要求将容器配置放在单独的文件中(以及为什么)?如果是,请寻找支持此功能的容器。但大多数人都这样做。

使用基于代码的DSL配置的一些示例:

xml配置的一些示例:

答案 1 :(得分:0)

取决于;)

  1. 我不能代表所有DependencyInjection工具,但其中许多应支持此功能。
  2. 我没有看到任何与此相反的言论。如果要显式调用不同的Logger,可以执行此操作。但是你也可以使用某种LogListener。一个用于DB,一个用于File,依此类推。您的Logger只是将LogMessage委托给所有Logger。但这取决于你想要什么或需要什么;)
  3. 这也取决于Logger的实现。将ConnectionString存储在配置中是很常见的。其他参数太具体了,但您也可以将它们存储在配置中。