Я пытаюсь выяснить, как лучше структурировать объекты в новом консольном приложении C #, чтобы оно соответствовало принципам ООП, чтобы его можно было многократно использовать, поддерживать, расширять и тестировать на единицах.
У меня есть следующая задача:
- Консольное приложение будет запускаться из планировщика задач
- Читает в xml-файле из общей папки
- XML-файл содержит числовые данные, которые необходимо агрегировать
- Результат этой агрегации необходимо отправить по электронной почте конечному пользователю
Для шагов 1 и 2 я планировал создать следующие классы:
FileToStringTransformer (это будет считывать содержимое xml-файла из общего файлового ресурса и переносить его в приложение в виде строки. Изоляция этого класса позволяет нам выполнять модульное тестирование других классов без зависимости от файла. поделиться, а также дает нам гибкость, чтобы изменить местоположение источника XML из файла на диске, чтобы сказать базу данных, не влияя на другие классы)
StringToXDocumentTransformer (это изменит строковый объект на объект XDocument)
XDocumentToDomainObjectTransformer (это сопоставит объект XDocument с объектом домена, чтобы было легко агрегировать числовые данные)
Я планировал, чтобы объект XDocumentToDomainObjectTransformer "имел" объект StringToXDocumentTransformer, а объект StringToXDocumentTransformer "- объект FileToStringTransformer. Это делается для того, чтобы один вызов объекта XDocumentToDomainObjectTransformer вызывал методы для двух других объектов, чтобы вам не пришлось явно записывать вызовы во все три класса везде, где вы хотите преобразовать файл на диске в объект домена.
Но я понял, что недостатком этого является то, что вы не сможете повторно использовать классы изолированно друг от друга - я не могу сказать, что повторно используйте один класс XDocumentToDomainObjectTransformer, потому что дерево зависимостей включает в себя два других класса. Как лучше всего спроектировать объекты для шагов 1 и 2 задачи, чтобы они соответствовали принципам ООП?