質問

私は、レガシー・アプリケーションによる消費のために、特定の形式で、それぞれ、フラットファイルに(様々なデータベース/テーブルから)企業データを有効にする必要があります保守アプリケーションを持っています。私は

のようなデータモデルを持っています
public class StatusCode
{
    public String Id { get; set; }
    public Char Level { get; set; }
    public String Description { get; set; }
}

私は、データソースからいくつかのサブセットまたはこれらのすべてのレコードを選択します。私は、1つのデータを調整する必要ができるファイルの行、(パディング、形質転換、またはnullを扱う)に各エンティティをマッピングする必要があります。

public delegate String MapEntity<T>(T entity);
public MapEntity<StatusCode> MapStatusCode = delegate(StatusCode entity)
{
    return String.Format("{0},{1},{2}",
        entity.Id.PadLeft(3, '0'),
        entity.Level == 'S' ? 0 : 1,
        entity.Description ?? "-");
}

問題は、どのように私は、変換クラスを書くのですか?私はマッピングデリゲートを取る「DefaultFileCreator」を提供していますか?

public interface IFileCreator
{
    Byte[] Create<T>(MapEntity<T> map, IEnumerable<T> entities);
}

public class DefaultFileCreator : IFileCreator
{
    public Byte[] Create<T>(MapEntity<T> map, IEnumerable<T> entities)
    {
        StringBuilder sb = new StringBuilder();
        foreach (T entity in entities)
            sb.AppendLine(map(entity));

        return Encoding.Default.GetBytes(sb.ToString());
    }
}

...
fileCreator.Create(MapStatusCode, repository<StatusCode>.FindAll());
...

このソリューションにより、私はマッピングデリゲートを維持する必要がどこで、どのような範囲で心配です。そして、どのように私は(私が今までに必要がある場合)Tを知らなくても、それらを呼び出すつもりです。

それとも、私はインターフェイスを変更し、具体的なクラスでマッピングを必要としますか。

public interface IFileCreator<T>
{
    Byte[] Create(IEnumerable<T> entities);
}

public abstract class FileCreator : IFileCreator<T>
{
    protected abstract String Map(T entity);

    public Byte[] Create(IEnumerable<T> entities)
    {
        StringBuilder sb = new StringBuilder();
        foreach (T entity in entities)
            sb.AppendLine(Map(entity));

        return Encoding.Default.GetBytes(sb.ToString());
    }
}

public class StatusCodeFile : FileCreator<StatusCode>
{
    public override String Map(T entity)
    {
        return String.Format("{0},{1},{2}",
            entity.Id.PadLeft(3, '0'),
            entity.Level == 'S' ? 0 : 1,
            entity.Description ?? "-");
    }
}

このソリューションは、具体的なクラスで爆発するが、それらは、マッピングの代表者のように薄いです。そして、私はIFileCreator<T>、工場での作業がより快適に感じます。 (再び、必要な場合のみ)。

IはStringBuilderループとByte[]符号化が簡単であるなどのいくつかの基本クラスが有用であると仮定しています。具象クラスは、(むしろ抽象メソッドを呼び出すよりも)基本クラスのデリゲートのプロパティを設定する必要がありますか?私は(とどのようにそれがベース/具象クラスに影響を与える)メソッドの型パラメータを保つべきですか?

私はすべてのソリューションのためにアップです。私の主な目標は、メンテナンスの容易さです。私は今12モデル/ファイルを持っており、これは21までの私は(私はoverrideable基底クラスのメソッド、地図が好きな理由である)任意のファイルに任意のヘッダ/フッタ行を挿入するための要件を有することができる増やしてます。

役に立ちましたか?

解決 2

今、私が変換のいくつかを書いたことを、私は、マッピング・クラスごとのアプローチに傾いています、。私は、ファイルが(既知の良好なサンプルファイルに対してそれらをテストする)適切に構築されていることを確認するために偽造されたモデルに対して、ユニットテストを実行できるようにする必要があります。

私は、彼らが(モデル/ファイルごとに1つの「ワークフロー」)に所属する「ワークフロー」のクラスにプライベートマッピング代表団を作ってきました。私は(ワークフローがデータストアに完了したファイルを保存)中間ファイルの内容を、それらをテストユニットにそれらを公開するために持っているか、出力と思います。

マッピングあたりのクラスには、より多くのテスト可能と分解ようです。

他のヒント

あなたが実際には各可能なマッピングのための具象サブクラスを作成する必要がありますか?多分代わりに、ファイルの種類ごとの形式/内容を記述するためのXMLファイル(またはデータベース)を使用することが可能です。あなたはそのためのFileTypeファイルを構築する方法を決定する「のFileType」キーを取り、XMLからの書式情報を使用して、単一のクラスを持っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top