我有一个具有由传统应用程序打开企业数据(从各种数据库/表格)到平面文件,在每一个特定的格式,消费的维护应用程序。我已经得到了数据模型,如

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

我将选择从数据源的一些子集或全部的这些记录。我需要每个实体映射到该文件的一行,这可能需要调整数据(填充,转化,或处理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>和工厂工作。 (同样,仅在必要时)。

我假设一些基类作为StringBuilder环和Byte[]编码是简单的是非常有用的。如果具体类设置在基类中的委托财产(而不是调用一个抽象方法)?我应该保持在方法类型参数(以及如何将影响基/混凝土类)?

我为任何溶液。我的主要目标是便于维修。我有12个型号/文件现在,这可能会增加至21。我可以具有要求的任何文件中插入任意的页眉/页脚线(这就是为什么我喜欢的覆写投放基类的方法,地图)。

有帮助吗?

解决方案 2

现在,我已经写了一些变换的,我倾向于则映射每个类的做法,。我必须要能够对伪造模型,以确保文件被正确建立运行单元测试(测试它们对已知的良好范例文件)。

我已经作出了测绘,私人委托他们在(一个“工作流程”每个模型/文件)所属的“工作流程”类。我不得不让他们公开于单元测试它们,或输出的中间文件的内容(工作流保存完成的文件到数据存储)。

映射每类似乎更大量可测试和分解。

其他提示

你有没有真正为每个可能的映射创建具体的子类?也许这将是可能的,而不是使用XML文件(或数据库)来描述各种文件格式/内容。那么你有一个类,需要一个“文件类型”项,并通过使用XML格式的信息,以确定如何构建该文件类型的文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top