4

データを監視/処理するための簡単なプロジェクトに取り組んでいます。基本的に、それは単なるモニター、スケジュール、およびプロセッサーです。モニターは、スケジュールを使用してデータ (ftp、local、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がこの混乱に収まるかどうかについて、私は少し引き裂かれています. 最終的には、監視インスタンスごとのバインディングのセットになります。これは、config がカバーできるデフォルトを除いて無意味に思えます。

4

2 に答える 2

0

この種のことを行ったときIConfigurationSectionHandler、基本的に構成を解析し、構成で指定されたタイプのオブジェクトを作成し、それらを何らかのデータ構造 (通常はリストまたは辞書)。を使用するかどうかにIConfigurationSectionHandler関係なく、構成ファイルの解析と 1 つのクラス (またはセクションごとに 1 つ) でのオブジェクトの作成を処理するコードをローカライズするため、ファクトリが最適な方法だと思います。

また、コンストラクターに多くのパラメーターを持つクラスよりも、構成用の単純なコンストラクターとプロパティ セッター/ゲッターを持つクラスを好みます。これにより、ファクトリの操作が容易になり、ファクトリと構築中のクラスの間の結合が減少します。

于 2008-11-05T04:09:03.183 に答える
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 に答える