2013-07-12 35 views
1

前言:我正在編寫一套程序,用於從共享驅動器中檢索文件,將它們轉換爲數據庫中的幾個表格,使用戶能夠執行CRUD操作記錄在數據庫中(通過MVC4 ASP.NET Web應用程序),然後將數據庫中的記錄重新組合爲相同的文件格式,並將這些文件傳回大型機。這些文件表示從主機VSAM文件提取的數據,我無法控制格式。還有其他一些類似的項目即將出現 - 檢索,翻譯,編輯,彙編和上傳大型機提取文件。一切都完成了,但是我編寫代碼來組裝文件的方式不可重複使用,並且只針對當前項目域模型中的實體對象。如何爲實體對象生成自定義文本文件

機會:由於其他即將到來的項目的文件中的數據是非常相似的格式,我想有一些可重新編譯的代碼來重新組合這些文件。

數據:下面代表一些模擬文件數據。文件中的每行文本(我現在稱之爲記錄)可以是特定的長度(本例中爲80字節)。該記錄可以是以星號爲前綴的評論。未註釋的記錄可以是4種不同的類型。

  • 序列拖車
  • 表拖車
  • 表型拖車

A '線' 屬於 '序列'(序列號 - 唯一獨特的表) 。 「序列」屬於「表」(表格鍵 - 文件唯一)。 '表'有一個類型,表格按照它們的類型和文件中的鍵進行排序。

線路有下述順序的:

  1. 三位數的業務代碼。
  2. 三字符表類型。
  3. 五個字符表鍵。
  4. 九位序列號。留下零填充。
  5. 六位數行號。留下零填充。
  6. 三字符動作碼。
  7. One character incl。碼。
  8. 五位數值的長度。
  9. 其餘都是價值。

的序列拖車具有下述順序的:

  1. 三位數的業務代碼。
  2. 三字符表類型。
  3. 五個字符表鍵。
  4. 九位序列號。留下零填充。
  5. 五位填充符('9')。
  6. 序列中的九位數行數(左邊填零)。

表拖車具有下述順序的:

  1. 三位數的業務代碼。
  2. 三字符表類型。
  3. 五個字符表鍵。
  4. 十四位數填充符('9')。
  5. 表中序列的九位數計數(左填零)。

的桌子拖車具有下述順序的:

  1. 三位數的業務代碼。
  2. 三字符表類型。
  3. 十九位數填充符('9')。
  4. 文件中有9位數的表格(帶#2表格類型)。 (左零填充)。

表尾部在文件中的每個有序表集之後發生。

 
************************************************************************ 
* TABLE 00001 - SOME MORE COMMENTS 
*   04/04/11 CREATED TABLE 
************************************************************************ 
* COMMENT FOR SEQ 1 
720PFT0000100000001000001PROI00011E1037-E1039 
720PFT0000100000001000002PGMI000016 
720PFT0000100000001000003RTN 00004 NAC 
720PFT0000100000001099999000000003 
* COMMENT FOR SEQ 2 
720PFT0000100000003000001PROI00011E1037-E1039 
720PFT0000100000003000002CLSI000037,8 
720PFT0000100000003000003MEDE000010 
720PFT0000100000003000004RTN 00004 NAC 
720PFT0000100000003099999000000004 
720PFT0000199999999999999000000002 
720PFT9999999999999999999000000001 

代碼:以下表示域模型的實體(我排除了簡潔相關實體):

[Table("Line",Schema="Pft")] 
public class Line 
{ 
    #region Entity Properties 

    [Key] 
    public int LineId { get; set; } 

    [Required] 
    public short LineNumber { get; set; } 

    [StringLength(255)] 
    public string Comment { get; set; } 

    [Required] 
    public int SequenceId { get; set; } 

    [Required] 
    public int IncludeExcludeId { get; set; } 

    [Required] 
    public int QualifierId { get; set; } 

    [Required] 
    [ForeignKey("PlanFlexTable")] 
    public int PlanFlexTableId { get; set; } 

    #endregion 
} 

[Table("Sequence", Schema="Pft")] 
public class Sequence 
{ 
    #region Entity Properties 

    [Key] 
    public int SequenceId { get; set; } 

    [Required] 
    public int SequenceNumber { get; set; } 

    [StringLength(511)] 
    public string Comment { get; set; } 

    #endregion 
} 

[Table("PlanFlexTable", Schema = "Pft")] 
public class PlanFlexTable 
{ 
    #region Entity Properties 

    [Key] 
    public int PlanFlexTableId { get; set; } 

    [Required] 
    public int StatusId { get; set; } 

    [StringLength(5, MinimumLength = 5)] 
    [Required] 
    public string Key { get; set; } 

    [StringLength(255)] 
    [Required(AllowEmptyStrings = true)] 
    public string Title { get; set; } 

    [Display(Name="Table Comment")] 
    public string Comment { get; set; } 

    public int PlanFlexTableTypeId { get; set; } 

    public int UpdateHistoryId { get; set; } 

    [StringLength(3)] 
    [Required] 
    public string PlanId { get; set; } 

    #endregion 
} 

摘要:我尋求建議用於發電的可重用的方式像我上面提到的文件。目前,我有一個類需要一個IEnumerable的PlanFlexTable實體,並對它進行迭代以組裝要上傳的文件。我曾考慮使用反射來創建一些屬性,以便讓實體定義如何構建文件;不過,我真的很感激有關於其他可能性的更多反饋和想法。

謝謝!

+1

閱讀所有這些教科書並不容易.. :) – codingbiz

回答

0

你想要動態生成代碼....嘗試T4?你可以爲你的實體類使用模式要素(密鑰等),並根據VSAM文件填寫其餘的類(爲此你將有一個可重用的解析器..)

您的CRUD工具的其餘部分很可能是可重用的(生成的)實體類和數據庫表?

+0

如果我不清楚,我很抱歉。我不需要動態生成實體類代碼。我希望能夠基於實體類的實例生成文件提取(在我的文章的「數據」部分),這就是爲什麼我正在考慮反射(因爲我後面的過程與序列化類似)。 – Cashew

相關問題