2016-08-17 27 views
0

我有我正在嘗試編碼實用工具解析的日誌。構建我的類型的最佳實踐

這些日誌的結構爲CSV,但部分(列)的數量因「交易類型」而異。 「交易類型」大約有50種不同的可能性,所以爲每種類別制定一個類別是不可行的。

例日誌條目:

2016-08-02 10:36:30.578 (Machine: 00124) Received: 1120228,T,2016-08-02 10:36:30,5,18441,209719,1,20 
2016-08-02 10:36:30.594 (Machine: 00124) Sent: 1120228,T,2016-08-02 10:36:30,0,,0,18441,DhfMAAfjhsb6CiW55999999TbNakCC3Fc8jaZ 

每個Received具有匹配Sent。這些值和代表的參數相差ReceivedSent以及交易類型。

這個想法和現在的實現如下。

  1. 負載線和分割上逗號(,)
  2. 確定從XML「交易類型」
  3. 負載相關聯的模式和增益值表示爲每個參數。
  4. 存放在類型取決於它是否ReceivedSent

實施現狀:

public class Message : IMessage 
     { 
      private List<Received> _receivedMessage; 
      private List<Sent> _sentMessage; 

      public Message() 
      { 
       ReceivedMessage = new List<Received>(); 
       SentMessage = new List<Sent>(); 
      } 

      public Message(
        string messageID, 
        List<Received> receivedMessage, 
        List<Sent> sentMessage, 
        string storedProcedure, 
        string transShortName) 
      { 
       MessageID = messageID; 
       ReceivedMessage = receivedMessage; 
       SentMessage = sentMessage; 
       StoredProcedure = storedProcedure; 
       TransShortName = transShortName; 
      } 

      public string MessageID { get; set; } 

      public List<Received> ReceivedMessage 
      { 
       get { return new List<Received>(_receivedMessage.OrderBy(_ => _.Position)); } 
       set { _receivedMessage = value; } 
      } 

      public List<Sent> SentMessage 
      { 
       get { return new List<Sent>(_sentMessage.OrderBy(_ => _.Position)); } 
       set { _sentMessage = value; } 
      } 

      public string StoredProcedure { get; set; } 

      public string TransShortName { get; set; } 

      public class Sent : ISent 
      { 
       public string MessageID { get; set; } 

       public dynamic Value { get; set; } 

       public string Parameter { get; set; } 

       public string Position { get; set; } 
      } 

      public class Received : IReceived 
      { 
       public string MessageID { get; set; } 

       public dynamic Value { get; set; } 

       public string Error { get; set; } 

       public string Parameter { get; set; } 

       public string Position { get; set; } 

       public string Regex { get; set; } 

       //public string TransShortName { get; set; } 
      } 
     } 

ISent接口:

public interface ISent 
    { 
     string Parameter { get; set; } 
     string Position { get; set; } 
     dynamic Value { get; set; } 
    } 

IReceived接口:

public interface IReceived 
    { 
     string Error { get; set; } 
     string Parameter { get; set; } 
     string Position { get; set; } 
     string Regex { get; set; } 
     //string TransShortName { get; set; } 
    } 

想法,最佳實踐,任何事情,都受到歡迎!

回答

2

如果你不想爲每種類型都有一個類,那麼我建議將常見屬性作爲常規屬性,並將動態屬性作爲字典中的鍵/值對。在代碼中的某個時刻,您將不得不知道某個類型中的屬性。另外,如果您有全部50種類型的模式,則可以使用XSD命令行工具從架構生成C#類。命名約定可能有點古怪:)。

+0

我知道它們是什麼,通過引用解析的XML事務模式並按事務類型查找。我現在的設置基本上有類似的東西。每一行分別成爲'List '或'List '。 –

+0

@DevinStokes我會問這個問題,你真的需要這兩種類型的ISent和IReceived嗎?你可以有一個枚舉作爲一個屬性來指定類型來完成SledgeHammer的回答(在某種意義上只有一個類來管理整個)。 –

+0

我想這會工作。那麼你說的是用'Parameter'' Position'和'Value'實現「ITransactionMessage」嗎? –