2012-01-20 3 views
0

Я пишу приложение Windows Forms, которое читает файл, обрабатывает его и затем совершает изменения.Подключение событий формы к различным объектам

В зависимости от некоторых обстоятельств, когда я нажимаю «Кнопка процесса» из формы, я хочу, чтобы она взаимодействовала с определенным объектом, например, в зависимости от расширения файла, файл обрабатывается определенным классом, который обрабатывает этот тип файла.

Что касается архитектуры приложения, то что это лучший способ сделать это?

+0

Вопрос довольно общий, есть ли у вас какой-то код, который вы могли бы опубликовать? –

+0

Извините, что не отправлял код, у меня есть код, но это полный беспорядок около 9000 строк кода: s, я собираюсь переписать его. Приложение довольно сложно, но основная концепция - это что-то вроде примера, который я дал. –

ответ

2

Так, например, файл .txt обрабатывается TextParser, CSV-файл обрабатывается CSV-файлом, файл .doc обрабатывается MSWordParser, все остальное обрабатывается GenericParser и т. Д.?

Ну, первое, что нужно было бы создать интерфейс, то есть IParser, чтобы каждый класс имел метод .Parse (file).

Следующая задача заключается в сопоставлении строк расширения файлов с классами. Первое, что приходит мне в голову, это Словарь. Ключ будет расширением файла как строкой, и значение будет синтаксическим анализатором для расширения этого типа файла. Перед выполнением любой обработки вы должны заполнить словарь всеми расширениями файлов, которые вы хотите поддерживать.

Некоторые предпосылки для этого хорошо работают: -Вы не имеете большого количества поддерживаемых расширений файлов. -Один экземпляр синтаксического анализатора может использоваться повторно -повторный парсер не особенно дорог; существует минимальная инициализация, выходящая за рамки того, что нужно сделать для нового объекта.

+2

Это хорошая идея. Возможно, используйте шаблон [Factory Method] (http://www.blackwasp.co.uk/FactoryMethod.aspx) для создания экземпляров типов, полученных из 'IParser', передав расширение файла FactoryMethod? –

0

Я бы пошел с чем-то вроде шаблона Factory.

public interface IFileParser 
{ 
    void perse(string fileToParse); 
} 


    public static class FileParserFactory 
    { 
     public static IFileParser GetParser(string fileToParse) 
     { 
      FileInfo file = new FileInfo(fileToParse); 
      IFileParser parserToReturn = null; 

      switch (file.Extension.ToLower()) 
      { 
       case "csv": parserToReturn = new CSVFileParser(fileToParse); 
        break; 
       case "txt": parserToReturn = new TextFileParser(fileToParse); 
        break; 
      } 

      return parserToReturn; 
     } 
    } 
Смежные вопросы