Я знаю, что на этот вопрос может показаться ответ раньше, но я чувствую, что ответ варьируется от случая к случаю, поэтому, прочитав несколько сообщений, я не уверен, что в моем случае лучше всего подходит для моей архитектуры.
У меня есть библиотека компонентов, в которой есть модель данных и базовые функции, которые должны быть доступны любому приложению, реализующему этот компонент.
У меня есть граница для этого компонента, у которого есть интерфейс IReader для загрузки и обработки файлов с диска и IDataMapper для обеспечения доступа к базе данных и операций CRUD. несколько других интерфейсов для определенных функций, таких как IObjectComparison для сравнения объектов, IXMLSerialization для сериализации XML.
Я не уверен, где хранить определение этих интерфейсов.
Возможные варианты:
1) - В основной библиотеке, тогда, когда я буду писать реализации, мне придется включить библиотеки реализации в этот основной компонент, при этом я хотел бы сохранить декодированный из реализаций.
2) - В отдельном библиотечном проекте (сборке). Все интерфейсы есть и включены в основной компонент и включены в библиотеки реализации.
3) - В библиотеках реализации основной компонент должен будет включать библиотеки реализации.
Единственный случай, когда это кажется разумным развязкой, - это если я помещаю все интерфейсы в отдельную библиотеку сборки, в которую входит компонент Core, и любые реализации, которые могут мне понадобиться.
Как вы думаете, какие плюсы / минусы лучшего варианта? Все, что я хочу достичь, - это независимая архитектура.
Итак, когда я это сделаю
Конструктор:
CoreComponent(IReader Reader, IDataMapper Mapper)
new CoreComponent(WindowsReader, SQLServerMapper)
и не нужно включать WindowsReader или SQLServerMapper в основной компонент
Ваше здоровье.