2011-06-21 8 views
2

私は、さまざまな種類のトランザクションファイルを解析して処理するファイル処理サービスを作成しています。私は、次のようにさまざまなタイプのトランザクションの実装を持つ汎用ファイルパーサを持っています。クラス内の汎用フィールドの作成

public interface IFileParser<T> 
{ 
    List<T> Parse(StreamReader fileStream); 
} 

public MonthlyParser : IFileParser<MonthlyTransaction> 
{ 
    public List<MonthlyTransaction> Parse(StreamReader fileStream) 
    { 
     ...... 
    } 
} 

public DailyParser : IFileParser<DailyTransaction> 
{ 
    public List<DailyTransaction> Parse(StreamReader fileStream) 
    { 
     ..... 
    } 
} 

public enum FileTypes 
{ 
    DailyTransaction, 
    MonthlyTransaction 
} 

public class FileProcessor 
{ 
    private TransactionContext dataContext; 
    private IFileParser<T> fileParser; 

    public FileProcessor(TransactionContext dbContext) 
    { 
     dataContext = dbContext; 
    } 

    public void ProcessFile(string filePath, FileType fileType) 
    { 
     // here instantiate IFileParser based on FileType. 
     // parse and process file. 
    } 

} 

私の問題は、私は具体的なimplemenationを割り当てて使用可能なものの一般的なインターフェイスのFileProcessorクラスのフィールドを作成するにはどうすればよいのですか?私はインスタント化をIoCに移すことも考えています。

答えて

3

IFileParser<T>のフィールドを使用する場合は、FileProcessorも汎用にする必要があります。

しかし、どうして実際にその型のフィールドを持つ必要があるのか​​はわかりません。ProcessFileのローカル変数ではないのはなぜですか?リストを作成してもリストで何をするのかは完全にはっきりしていません...各要素で何をしますか?

+0

個々のトランザクションの追加処理を行い、dbに保存する必要があります。現在、FileTypeに基づいてProcessFile内の具体的な実装のローカル変数を使用しています。私は、ローカル変数をインスタンスフィールドで置き換えることができるかどうかを見たいと思っていました。 – Satish

+0

@Satish:なぜですか?本当にそこにフィールドがあるのはどういう意味ですか? 'IFileParser 'を作成したが、間違った 'FileType'でファイルを解析するように求められたらどうなるでしょうか?あなたがそうしたら、それを一般的にするだけです。 –

+0

私はそれはありません:)私はローカル変数のアプローチに固執すると思います。ありがとう。 – Satish

関連する問題