Frage

Ich habe eine Wartung der Anwendung, drehen und enterprise-Daten (aus verschiedenen Datenbanken/Tabellen) in flache Dateien, die jeweils in einem bestimmten format, für den Verbrauch durch eine legacy-Anwendung.Ich habe Daten wie Modelle

public class StatusCode
{
    public String Id { get; set; }
    public Char Level { get; set; }
    public String Description { get; set; }
}

Ich werde wählen Sie einen Teil oder alle diese Datensätze aus der Datenquelle.Und ich brauche die Karte für jede Entität in eine Zeile der Datei, die erfordern, die Anpassung der Daten (Polsterung, die Umwandlung, oder die Handhabung 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 ?? "-");
}

Die Frage ist, wie Schreibe ich die transformation Klassen?Erstelle ich ein "DefaultFileCreator", der eine Zuordnung zu delegieren?

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());
...

Mit dieser Lösung bin ich besorgt darüber, wo und in welchem Umfang sollte ich halten die mapping-Teilnehmer.Und wie werde ich Sie anrufen, ohne zu wissen, T (wenn ich jemals müssen).

Oder, ändere ich das interface und erfordern die Zuordnung in den konkreten Klassen?

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 ?? "-");
    }
}

Diese Lösung explodiert in konkreten Klassen, aber Sie sind so Dünn wie die mapping-Teilnehmer.Und ich fühle mich wohler, arbeiten mit IFileCreator<T> und eine Fabrik.(wieder, nur, wenn notwendig).

Ich gehe davon aus, dass einige Basis-Klasse ist besonders nützlich, da die StringBuilder Schleife und Byte[] Kodierung sind einfach.Sollte die konkrete Klasse legen Sie eine delegate-Eigenschaft in der Basisklasse (anstatt dem Aufruf einer abstrakten Methode)?Sollte ich den type-parameter auf die Methode (und wie würde sich das auf die Basis - /Beton-Klassen)?

Ich bin für jede Lösung.Mein Ziel ist es, einfache Wartung.Ich habe 12 Modelle/files right now-und das kann sich steigern bis zum 21.Ich kann eine Anforderung zum einfügen von beliebigen Kopf - /Fußzeilen in eine Datei (das ist, warum ich mag die überschreibbar Basisklasse, die Methode, die Karte).

War es hilfreich?

Lösung 2

Jetzt, wo ich geschrieben habe, ein paar der Veränderungen, ich bin Neigung in Richtung der mapping-pro-class-Ansatz.Ich muss in der Lage sein, um unit-tests vor gefälschten Modelle so, dass die Dateien korrekt erstellt (testen Sie Sie gegen den bekannt guten Beispiel-Dateien).

Ich habe die mapping-Delegierten privaten zu den "workflow" - Klasse, zu denen Sie gehören (ein "workflow" pro Modell/Datei).Ich hätte um Sie öffentlich zu unit-testen, oder Ausgang die temporäre Datei von Inhalten (workflow speichert die fertigen Dateien auf einen datenspeicher).

Die mapping-pro-Klasse scheint viel mehr getestet und decomposable.

Andere Tipps

Sie haben, um tatsächlich konkrete Unterklassen für jede mögliche Zuordnung?Vielleicht wäre es möglich, stattdessen verwenden Sie eine XML-Datei (oder eine Datenbank) zu beschreiben, die format/Inhalte von jeder Art von Datei.Sie haben dann eine einzelne Klasse, die es braucht, "FileType" Schlüssel und nutzt die Informationen zur Formatierung von XML -, um zu bestimmen, wie zum erstellen der Datei für diesen Dateityp.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top