设计一个数据模型,平面文件转换...委托或继承?
-
13-09-2019 - |
题
我有一个具有由传统应用程序打开企业数据(从各种数据库/表格)到平面文件,在每一个特定的格式,消费的维护应用程序。我已经得到了数据模型,如
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格式的信息,以确定如何构建该文件类型的文件。