После завершения моего первого проекта, структурированного по принципам DDD: D, я обнаружил, что полезно иметь как доменные службы, так и репозитории, доступные для уровня приложений.
Ключевая точка: Прикладным уровнем может быть ваши службы WCF или код в ваших веб-службах, если вы используете эту архитектуру. Все зависит от вашей реализации. Если это соответствует вашей реализации, уровень приложения может совпадать с уровнем представления, поэтому код уровня приложения находится в ваших контроллерах или в коде веб-форм.
Хранилища функционируют как коллекции в памяти. На прикладном уровне код должен выглядеть так, как будто вы просто используете любую старую коллекцию.
Доменные службы функционируют больше как процессоры или средства доступа к информации, которая никогда не будет обновлена, может быть обработана, но не обновлена напрямую. На уровне приложения код должен выглядеть так, как будто вы просто используете любой старый веб-сервис.
При этом я объясню больше на нескольких примерах:
Хранилища
Мои репозитории фактически наследуются от универсальной коллекции, набранной с помощью созданного мной объекта реализации, который объединяет ключ базы данных и бизнес-модель вместе. Используя этот подход, я могу определить индексатор в моем интерфейсе, например
BusinessObject this[int index];
и у меня может быть метод получения, который будет возвращать бизнес-объект на основе индекса базовой коллекции, и метод установки, который будет искать ключ данных из базовой коллекции и сохранять объект в базе данных. Это делает код приложения чрезвычайно простым, например
IBusinessObjectRepository repository = new SqlBusinessObjectRepository(sqlString);
BusinessObject obj = repository[0]; //Get first object in the list.
//Make some changes to the business object by setting properties or calling methods to process business logic.
repository[0] = obj; //Save the object back to the database.
Услуга
Я использую службы для извлечения списков сущностей и объектов-значений, которые я не собираюсь редактировать по отдельности, и в моем случае они используются только как доступные выборки или значения при вызове методов в совокупном корне. Обычно я кеширую эту информацию на веб-сервере. Это не единственное использование доменной службы, только мой пример. Код прикладного уровня все еще остается относительно простым.
IBusinessService service = new ImplBusinessService(implementationArgs);
List<BusinessObject> objsToCache = service.GetBusinessObjects();
//cache the objects on the web server.
В заключение и из моего понимания принципов DDD прикладной уровень должен иметь возможность доступа к бизнес-объектам из сервисов или репозиториев. Выбор между ними сводится к тому, что лучше всего подходит в рамках модели предметной области.