在平面文件分组字段和数据结构设计模式(Design pattern for grouping fie

2019-10-21 06:31发布

我现在用的是FileHelpers C#库文件读入自定义对象的数组将被处理。 例如,部分文件的定义:

[FixedLengthRecord]
public class Row
{
    [FieldFixedLength(9)]
    [FieldTrim(TrimMode.Right)]
    public string Ssn;

    [FieldFixedLength(15)]
    [FieldTrim(TrimMode.Right)]
    public string LastName;

    ...
}

我试图通过OOP原则,而这样做遵守和我已经注意到,一些领域有自然分组(如SSNClientIDEmployerIDEmployerName等),所以我试图将它们分开成独立的类(如ClientEmployer )。 但是,这似乎有问题,因为某些字段需要在不同对象共享(例如ClientID需要知道相关EmployerID )。

为了进一步复杂的事情,我想与添加字段[FieldNotInFile]属性类的定义(一个或多个),因为在加工过程中,我的申请将查询符合特定行字段,数据库记录和填充行各自的[FieldNotInFile]小号(例如,获得客户的FName从数据库基于SSN因为它不是在文件中)。

你将如何构建呢? 那种我只是想保持整个文件行作为一类,但它接近75场,这似乎是荒谬的。 思考?

Answer 1:

甲FileHelpers类只是一个限定使用C#的语法的平面文件的说明书的方式。

因此,FileHelpers类是寻常型C#类的,你应该尝试使用OOP公认的原则。 (有很多方面FileHelpers类违犯了OOP原则,最明显的是它需要你使用公共区域,而不是属性)。 FileHelpers不应该超出了FileHelpers库所使用的那些属性或方法。

在FileHelpers类看作唯一的CSV格式的“规格”。 这应该是它唯一的作用。 然后,如果你需要更多的“正常”的对象的记录,然后将结果映射到更好的东西:

FileHelperEngine engine = new FileHelperEngine<FileHelpersOrder>(); 
var records = engine.ReadFile("FileIn.txt");

var niceOrders = records.Select(
    x => new NiceOrder() 
       { Number = x.Number,  
         Customer = x.Customer 
         // etc.
       });

其中FileHelpersOrder是您的CSV规范和NiceOrder类将是一个适当的面向对象的类作为必要的属性,方法等。



Answer 2:

我不知道一个特定的模式,但我不会在类中包含额外的字段的意思的反序列化/解析您的平面文件。 您可以将数据库字段添加到继承的类。



Answer 3:

在使用文件的帮手,我认为FileHelper类来表示文件中的记录。 你把在类(FixedLengthRecord或DelimitedRecord)顶部的属性让你想起了这一点 - 这是一个文件记录,而不是一个实际的实体模型。

这意味着如果你需要有一个对象,模型的实体,你就必须做很多从FileHelper类复制到您的实体类。

我有很多FileHelper个教学班,近75场 - 每个类代表一个文件规范,这往往是大的。 但这些都还是很维护 - 只需打开并排规范和代码文件侧面和下井场的名单找到你需要做任何改动。

然而,我会,分裂班头,拖车,和不同的行类型。 然后我会使用多记录引擎来决定使用哪一个类。



文章来源: Design pattern for grouping fields and structuring data in a flat file