Где хранить интерфейсы в разделенной архитектуре в моем решении C #?

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

У меня есть библиотека компонентов, в которой есть модель данных и базовые функции, которые должны быть доступны любому приложению, реализующему этот компонент.

У меня есть граница для этого компонента, у которого есть интерфейс IReader для загрузки и обработки файлов с диска и IDataMapper для обеспечения доступа к базе данных и операций CRUD. несколько других интерфейсов для определенных функций, таких как IObjectComparison для сравнения объектов, IXMLSerialization для сериализации XML.

Я не уверен, где хранить определение этих интерфейсов.

Возможные варианты:

1) - В основной библиотеке, тогда, когда я буду писать реализации, мне придется включить библиотеки реализации в этот основной компонент, при этом я хотел бы сохранить декодированный из реализаций.

2) - В отдельном библиотечном проекте (сборке). Все интерфейсы есть и включены в основной компонент и включены в библиотеки реализации.

3) - В библиотеках реализации основной компонент должен будет включать библиотеки реализации.

Единственный случай, когда это кажется разумным развязкой, - это если я помещаю все интерфейсы в отдельную библиотеку сборки, в которую входит компонент Core, и любые реализации, которые могут мне понадобиться.

Как вы думаете, какие плюсы / минусы лучшего варианта? Все, что я хочу достичь, - это независимая архитектура.

Итак, когда я это сделаю

Конструктор:

CoreComponent(IReader Reader, IDataMapper Mapper)

new CoreComponent(WindowsReader, SQLServerMapper)

и не нужно включать WindowsReader или SQLServerMapper в основной компонент

Ваше здоровье.


person DataAnalyst1    schedule 15.07.2014    source источник
comment
Физически? Может быть, распечатано в хранилище? ;п   -  person leppie    schedule 15.07.2014


Ответы (1)


Я бы выбрал вариант 1 - Базовая библиотека, поскольку это соответствует тому, как мы это делаем в DDD . В DDD мы обычно помещали интерфейсы IRepository на уровне домена вместо DAL или любого другого такого уровня.

DIP говорит, что компонент более высокого уровня будет владеть интерфейсом, как Википедия говорит ...

где интерфейсы, определяющие поведение / услуги, необходимые для высокоуровневого компонента, принадлежат и существуют в пакете высокоуровневого компонента.

Это наиболее распространенная практика, но не строгое правило.

Вариант 2 подходит, но вам нужно указать две библиотеки DLL в других проектах, но с вариантом 1 требуется только одна ссылка. Вариант 3 не подходит.

Надеюсь, это поможет. Спасибо.

person Praveen Prajapati    schedule 16.07.2014