Дизайн интерфейса класса C # - PullRequest
0 голосов
/ 14 июля 2011

Я пытаюсь разработать интерфейс для iTextsharp (библиотека для создания PDF), который я использую для своего проекта.Я не хочу никаких ссылок на iTextsharp в моем проекте, только интерфейс.

Допустим, у меня есть

     interface IPdfTable { /* */ }
     public class PdfTable : IPdfTable  { /* */ }

     interface IPdfCell { /* */ }
     public class PdfCell : PdfCell { /* */ }

Хотя я могу легко создавать интерфейсы для каждого класса индивидуально, я 'Я испытываю трудности при реализации, когда эти классы взаимодействуют друг с другом.Где-то в коде мне нужны таблицы, чтобы иметь возможность принимать коллекцию ячеек.

Проблема возникает, когда у меня есть коллекция ячеек, и мне нужно добавить ее в таблицу.Каким-то образом мне нужно преобразовать IPdfCell в исходный элемент, который принимается библиотекой (iTextSharp).Я считаю, что быстрая и простая реализация была унылой, но не очень удачной разработкой.

Единственное другое решение, о котором я могу подумать, это использование интерфейса для сбора различных настроек и создания оригинального элемента (принятого iTextsharp) на летукогда он передается другим элементам.

Есть ли лучшая реализация?

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

Я не понимаю цели такого интерфейса. Независимо от того, что ваш код генерации PDF будет привязан к используемой вами библиотеке, создание прокси-классов / интерфейсов, которые точно отражают библиотеку, не предотвращает этого, а просто добавляет еще один слой. Если бы вы переключились на другую библиотеку генерации PDF, крайне маловероятно, чтобы новая библиотека соответствовала 1: 1 с эквивалентами в iText, и вы в конечном итоге все равно изменили бы интерфейс и вызывающий код.

Я бы порекомендовал создать IPDFGenerator, а затем создать iTextPDFGenerator:IPDFGenerator, который связан с iText, и оставить все как есть. Вы получите желаемое разделение, возможность не допускать iText в свои основные сервисы, но для этого не потребуется куча бессмысленных сопоставлений между одинаковыми классами.

Я думаю, вы должны пересмотреть S, I и D в SOLID и убедиться, что вы не переусердствовали.

0 голосов
/ 14 июля 2011

Обычно у вас есть слой перевода, который переводит реализацию вашего интерфейса в типы, изначально поддерживаемые iTextSharp.

AutoMapper может помочь в этом, если вам требуется привязка свойств к сопоставлениям свойств, и может удалить большую часть работы по переводу для вас.

...