Я должен спроектировать и построить скрипт импорта (в C #), который может обрабатывать следующее:
- читать данные из разных источников (XML, XSLX, CSV)
- проверить данные
- записать данные в различные типы объектов (клиент, адрес)
Данные будут поступать из нескольких источников, но источник всегда будет иметь один формат импорта (csv, xml, xslx). Форматы импорта могут варьироваться от источника к источнику. Новые форматы импорта могут быть добавлены в будущем. Типы объектов назначения всегда одинаковы (клиент, адрес и некоторые другие).
Я думал об использовании дженериков и кое-что прочитал о заводском паттерне, но я довольно большой новичок в этой области, поэтому любые советы более чем приветствуются.
Каков подходящий шаблон проектирования для решения этой проблемы?
c#
design-patterns
Джао
источник
источник
Ответы:
Вы идете за борт с причудливыми концепциями слишком рано. Дженерики - когда вы видите дело, используйте их, но не волнуйтесь. Фабричный шаблон - слишком большой гибкости (и добавленной путаницы) для этого пока нет.
Будь проще. Используйте фундаментальные практики.
Попробуйте представить себе что-то общее между чтением для XML и чтением для CSV. Такие вещи, как следующая запись, следующая строка. Поскольку могут быть добавлены новые форматы, постарайтесь представить общность, которая будет иметь определенный формат с известными. Используйте эту общность и определите «интерфейс» или контракт, которому должны соответствовать все форматы. Хотя они придерживаются общих позиций, у всех них могут быть свои особые внутренние правила.
Для проверки данных попробуйте предоставить способ легко подключать новые или разные блоки кода валидатора. Итак, еще раз, попытайтесь определить интерфейс, в котором каждый валидатор, отвечающий за определенный вид построения данных, придерживается контракта.
Для создания конструкций данных вы, вероятно, будете ограничены тем, кто разрабатывает предлагаемые выходные объекты больше всего. Попытайтесь выяснить, каков следующий шаг для объектов данных, и есть ли какие-либо оптимизации, которые вы можете сделать, зная конечное использование. Например, если вы знаете, что объекты будут использоваться в интерактивном приложении, вы могли бы помочь разработчику этого приложения, предоставив «суммы» или подсчеты объектов или другие виды производной информации.
Я бы сказал, что большинство из них - это шаблоны шаблонов или шаблоны стратегий. Весь проект был бы шаблоном Адаптера.
источник
Очевидная вещь - применить шаблон «Стратегия» . Иметь общий базовый класс
ReadStrategy
и для каждого входного формата свой подкласс, напримерXmlReadStrategy
,CSVReadStrategy
и т. Д. Это позволит вам изменять обработку импорта независимо от обработки проверки и обработки вывода.В зависимости от деталей может также быть возможно сохранить большинство частей общего импорта и обмениваться только частями обработки ввода (например, чтение одной записи). Это может привести вас к шаблону шаблона метода .
источник
Подходящим шаблоном для утилиты импорта, который может потребоваться в будущем, будет использование MEF - вы можете сохранить низкое использование памяти, загружая нужный преобразователь на лету из ленивого списка, создавая импорт MEF, который украшен атрибутами это помогает выбрать правильный конвертер для импорта, который вы пытаетесь выполнить, и обеспечивает простой способ выделения различных классов импорта.
Каждая часть MEF может быть построена для удовлетворения интерфейса импорта с помощью некоторых стандартных методов, которые преобразуют строку файла импорта в ваши выходные данные или переопределяют базовый класс базовыми функциями.
MEF - это фреймворк для создания архитектуры плагинов - его внешний вид и Visual Studio - все эти прекрасные расширения в VS являются частями MEF.
Чтобы создать приложение MEF (Managed Extensability Framework), начните с включения ссылки на
System.ComponentModel.Composition
Определите интерфейсы, чтобы определить, что будет делать конвертер
Это можно использовать для всех типов файлов, которые вы хотите импортировать.
Добавьте атрибуты в новый класс, которые определяют, что класс будет «экспортировать»
Это определит класс, который будет импортировать файлы CSV (определенного формата: Format1) и имеет настраиваемые атрибуты, которые устанавливают метаданные атрибутов экспорта MEF. Вы бы повторили это для каждого формата или типа файла, который вы хотите импортировать. Вы можете установить пользовательские атрибуты с помощью класса:
Чтобы использовать преобразователи MEF, вам необходимо импортировать части MEF, которые вы создаете при запуске кода преобразования:
catalog
собирает детали из папки, по умолчанию это местоположение приложения.converters
это ленивый список импортируемых деталей MEFЗатем, когда вы знаете, какой тип файла вы хотите конвертировать (
importFileType
иimportType
), получите конвертер из списка импортированных деталей вconverters
При вызове
converter.ImportData
будет использоваться код в импортированном классе.Может показаться, что кода много, и может потребоваться некоторое время, чтобы разобраться в происходящем, но он чрезвычайно гибок, когда дело доходит до добавления новых типов конвертеров, и может даже позволить вам добавлять новые во время выполнения.
источник
-1
от меня, поскольку основная идея все еще имеет смысл и опирается на шаблон стратегии, управляемыйIImportConverter
интерфейсом.В идиомах C # для этого используется встроенная среда сериализации. Вы аннотируете объекты с помощью метаданных, а затем создаете экземпляры различных сериализаторов, которые используют эти аннотации для извлечения данных, чтобы поместить их в правильную форму, или наоборот.
Xml, JSON и двоичные формы являются наиболее распространенными, но я не удивлюсь, если другие уже существуют в красивой упакованной форме для использования.
источник