DDD: хранилища, вызывающие службы приложений - PullRequest
1 голос
/ 06 июля 2011

Это является частью серии, основанной на моем понимании DDD:)

Исходя из предыдущего вопроса, но базовые знания не требуются: Система использует службы WCF из другой системыкогда базовые базы данных имеют отношения

Существует система документов и система управления персоналом.Система HR должна сохранять документ, а также некоторые специфические данные HR, относящиеся к документу.

Моей первой мыслью было, что вызов к Системе документов должен быть в Службе приложений системы управления персоналом (удален код unaceacery):

public class HRDocumentService
{
    public void SaveDocument(string filename, string employee)
    {
        long documentLibraryId = _documentLibraryService.SaveDocument(filename);
        HRDocument hrDocument = HRDocument.CreateDocument(documentLibraryId, employee);
        _hrDocumentRepository.Save(hrDocument);
    }
}

, а Репозиторий выглядит так:

public class HRDocumentRepository
{
    public long Save(HRDocument hrDocument)
    {
        _session.Save(hrDocument);
    }
}

Но Джейк Чарлтон говорит в этой статье"Что находится за хранилищем? Практически все, что вам нравится. Да, вы правильно поняли. У вас может быть база данных илимного разных баз данных. Вы можете использовать реляционные базы данных или объектные базы данных. У вас может быть база данных в памяти или синглтон, содержащий список элементов в памяти. У вас может быть слой REST, или набор служб SOA, или файл.система или кэш в памяти ... "

Итак, теперь я думаю, что служба должна быть просто такой:

public class HRDocumentService
{
    public void SaveDocument(string filename, string employee)
    {
        HRDocument hrDocument = HRDocument.CreateDocument(documentLibraryId, employee);
        _hrDocumentRepository.Save(hrDocument);
    }
}

и вызывает службу библиотеки документов в хранилище следующим образом:

public class HRDocumentRepository
{
    public long Save(HRDocument hrDocument)
    {
        long documentLibraryId = _documentLibraryService.SaveDocument(filename);
        hrDocument.DocumentLibraryId = documentLibraryId;
        _session.Save(hrDocument);
    }
}

Таким образом, возможно, хранилище по-прежнему отвечает только за постоянство.

Я на правильных линиях здесь или далеко?

Ответы [ 2 ]

3 голосов
/ 03 сентября 2011

Кажется, что репозитории, получающие доступ к сервисам приложений из других систем, являются вполне приемлемой практикой. Руководство по архитектуре приложений Microsoft поддерживает это в форме «сервисного агента», и приведенная выше цитата из Jak Charlton также поддерживает это.Если вы используете NHibernate для доступа к данным, вы можете сделать это, реализовав IUserType, как я уже упоминал в этом посте: NHibernate: отложенная загрузка IUserType .Это не универсальное решение - например, оно имеет низкую производительность, если вы возвращаете коллекцию, и каждая сущность должна сделать вызов WCF для своей дочерней сущности.Отвечая на вопрос об интеграции систем, люди часто выступают за обмен сообщениями и CQRS, но даже сам Уди Даан заявляет, что это не подходит для подавляющего большинства систем.

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

Доменные службы располагаются перед репозиториями и объектами, поэтому использование DocumentLibraryService внутри HRDocumentRepository не является «DDD-соответствием».

Ваша первая мысль была правильной!

Но сама логика (присвоить объекту какое-либо значение перед сохранением) вполне допустима в хранилище, если вы можете получить информацию не из службы, а из хранилища.

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

Роберт

...