4

我正在做一个快速的项目来监控/处理数据。本质上,这只是监视器、时间表和处理器。监视器使用计划检查数据(ftp、本地、imap、pop 等)并将新数据发送到处理器。它们都有接口。

我正在尝试找到一种理智的方式来使用 config 来配置每个监视器使用的调度/处理器。这很容易:

<monitor type="any.class.implementing.monitor">
    <schedule type="any.class.implementing.schedule">
        ...
    </schedule>
    <processor type="any.class.implementing.processor" />
</monitor>

我正在苦苦挣扎的是配置任何旧监视器/时间表/处理器的最佳方法是什么。一方面,可以实现构造函数参数或属性(不采用任何语法):

<monitor type="any.class.implementing.monitor">
    <args>
        <arg value="..." />
    </args>
    <properties>
        <property name="..." value=..." />
    </properties>
    <schedule type="any.class.implementing.schedule">
        ...
    </schedule>
    <processor type="any.class.implementing.processor" />
</monitor>

另一种解决方案是每个接口中的工厂方法,它将自定义配置作为参数:

public IMonitor Create(CustomConfigSection config);

我见过有人同时使用这两种方法。你喜欢哪个?将配置映射到构造函数时有什么技巧吗?

我对 DI 是否能融入这个烂摊子感到有些不安。最后,这将是每个监视器实例的一组绑定,除了配置可以覆盖的默认值之外,这似乎毫无意义。

4

2 回答 2

0

首先,我将定义代表监视器的配置元素:

public class MonitorElement : ConfigurationElement
{
    // ...whatever schema you prefer...
}

public class MonitorElementCollection : ConfigurationElementCollection
{
    // ...standard implementation...
}

以及托管它们的配置部分:

public class YourSection : ConfigurationSection
{
    [ConfigurationProperty("monitors")]
    [ConfigurationCollection(typeof(MonitorElementCollection))]
    public MonitorElementCollection Monitors
    {
        get { return (MonitorElementCollection) this["monitors"]; }
    }
}

然后,我将定义一个表示监视器集的接口:

public interface IMonitorRepository
{
    IEnumerable<Monitor> GetMonitors();
}

并创建一个读取配置文件的实现:

public sealed class ConfiguredMonitorRepository : IMonitorRepository
{
    private readonly string _sectionName;

    public ConfiguredMonitorRepository(string sectionName)
    {
        _sectionName = sectionName;
    }

    public IEnumerable<Monitor> GetMonitors()
    {
        var section = (YourSection) ConfigurationManager.GetSection(_sectionName);

        if(section != null)
        {
            foreach(var monitor in section.Monitors)
            {
                yield return ...create and configure monitor...
            }
        }
    }
}

这定义了您将配置转换为实际实例的位置,这只是您问题的一半。我认为用于设置构造函数参数和属性的 XML 语法很好。您或许可以从Autofac 的 XML 配置系统中收集到一些 API 和实现思路。

确实,您正在做的是 IoC 容器的强项;您可以考虑利用其中之一。

于 2010-02-07T18:08:07.357 回答
0

当我完成这种事情时,我实现了一个IConfigurationSectionHandler基本上作为工厂来解析配置,创建配置中指定类型的对象,并以某种数据结构(通常是 List 或字典)。无论您是否使用 an IConfigurationSectionHandler,我认为工厂都是可行的方法,因为您将本地化处理解析配置文件并在一个类(或每个部分一个)中创建对象的代码。

我也更喜欢具有简单构造函数的类和用于配置的属性设置器/获取器,而不是构造函数中具有大量参数的类。这使得工厂更容易操作,并减少了工厂与正在构建的类之间的耦合。

于 2008-11-05T04:09:03.183 回答