2016-08-17 13 views
0

ログがあります解析するユーティリティをコーディングしようとしています。ベストプラクティスMy Typeの構造​​化のため

これらのログはCSVとして構成されていますが、セクション(列)の量は「トランザクションタイプ」によって異なります。 "Transaction Type"には約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とトランザクションタイプによって異なります。

アイデアと現在の実装は次のとおりです。 COMMAに

  1. 負荷ラインとスプリット(、)
  2. 「トランザクションタイプ」
  3. XMLから読み込み関連付けられたスキーマを決定し、値ごとに表すパラメータを得ます。
  4. それはReceivedまたはSent

だ場合、現在の実装に依存するタイプストア:

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と私はこの質問をするでしょう、あなたは本当にこれらの2つのタイプのISentとIReceivedが必要ですか? SledgeHammerの答えを完成させるための型を指定するプロパティとして列挙型を持つことができます(この意味では、1つのクラスは全体を管理するだけです)。 –

+0

私はそれがうまくいくと思います。だからあなたが言っているのは、 "Parameter'' Position'と' Value'で "ITransactionMessage"と言う実装ですか? –

関連する問題