BO - это, по сути, ваши доменные объекты или, по крайней мере, это мое предположение. В общем, если вы не используете шаблон, подобный ActiveRecord, они являются только объектами состояния. Интерфейс, с другой стороны, определяет поведение. Из многих «лучших практик» не очень хорошая идея смешивать поведение и состояние. Теперь я, вероятно, немного побродит, но думаю, что фон может помочь.
Теперь к вопросу о том, где должны существовать интерфейсы. Есть несколько вариантов.
- Вставьте интерфейсы в библиотеку, к которой они принадлежат.
- Создать отдельную библиотеку контрактов
Проще всего вставить их в одну и ту же библиотеку, но тогда ваши макеты полагаются на библиотеку, а также на ваши тесты. Не такая уж большая сделка, но она слегка пахнет.
Мой обычный метод - настроить проекты следующим образом:
{компания}. {Программа / проект}. {Беспокойство (необязательно)}. {Область}. {Подрайон (необязательно)}
Первые два-три бита имени покрыты вашим словом "CentralRepository". В моем случае это будет MyCompany.CentralRepository или MyCompany.MyProgram.CentralRepository, но соглашение об именах не является основной частью этого поста.
Части "области" - это основной смысл этого поста, и я обычно использую следующее.
- Настройка библиотеки объектов домена (вашего BO): CentralRepository.Domain.Models
- Настройка библиотеки исключений домена: CentralRepository.Domain.Exceptions
- Все / большинство других проектов ссылаются на вышеупомянутые два, поскольку они представляют состояние в приложении. Конечно, ВСЕ бизнес-библиотеки используют эти объекты. Библиотеки персистенции могут иметь другую модель, и у меня может быть модель представления в библиотеке (библиотеках) опыта.
- Настройте основную библиотеку следующим образом: CentralRepository.Core (может иметь подрайоны?). Именно в этом и заключается бизнес-логика (фактическое применение, поскольку изменения в постоянстве и опыте не должны влиять на основные функции).
- Настройка библиотеки тестирования для ядра: CentralRepository.Core.Test.Unit.VS (У меня есть Unit.VS, чтобы показать, что это модульные тесты, а не интеграционные тесты с библиотекой модульных тестов, и я использую VS, чтобы указать MSTest - другие будут иметь разные названия).
- Создание тестов, а затем настройка бизнес-функций. При необходимости настройте интерфейсы. Пример * +1032 *
- Нужны данные из DAL, поэтому интерфейс и макет настроены для данных, которые будут использоваться для тестов Core. Имя здесь будет что-то вроде CentralRepository.Persist.Contracts (может также использовать подрайон, если существует несколько типов постоянства).
Основной концепцией здесь является «ядро как приложение», а не n-уровень (они совместимы, но если рассматривать только бизнес-логику как парадигму, то вы будете слабо связаны с постоянством и опытом).
Теперь вернемся к вашему вопросу. Способ, которым я настраиваю интерфейсы, основан на расположении "интерфейсных" классов. Итак, я бы, вероятно, имел:
CentralRepository.Core.Contracts
CentralRepository.Experience.Service.Contracts
CentralRepository.Persist.Service.Contracts
CentralRepository.Persist.Data.Contracts
Я все еще работаю с этим, но основная концепция - это мой IoC, и следует рассмотреть и тестирование, и у меня должна быть возможность изолировать тестирование, что будет лучше, если я смогу изолировать контракты (интерфейсы). Логическое разделение - это хорошо (отдельная библиотека), но я обычно так не думаю, потому что есть хотя бы пара «зеленых» разработчиков, которым трудно увидеть логическое разделение без физического разделения. Ваш пробег может варьироваться. : -0
Надеюсь, этот бродяга поможет каким-то образом.