Сложная ситуация на моем пути к пониманию DDD

Мы можем объединить / объединить все данные внутри одной коллекции с простой функцией в нескольких строках с помощью клиентской консоли mongodb, и теперь мы сможем выполнить требуемый запрос. Ниже полный пример:

.- Авторы:

db.authors.insert([
    {
        _id: 'a1',
        name: { first: 'orlando', last: 'becerra' },
        age: 27
    },
    {
        _id: 'a2',
        name: { first: 'mayra', last: 'sanchez' },
        age: 21
    }
]);

.- Категории:

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);

.- Книги

db.books.insert([
    {
        _id: 'b1',
        name: 'Groovy Book',
        category: 'c1',
        authors: ['a1']
    },
    {
        _id: 'b2',
        name: 'Java Book',
        category: 'c2',
        authors: ['a1','a2']
    },
]);

.- Книжное кредитование

db.lendings.insert([
    {
        _id: 'l1',
        book: 'b1',
        date: new Date('01/01/11'),
        lendingBy: 'jose'
    },
    {
        _id: 'l2',
        book: 'b1',
        date: new Date('02/02/12'),
        lendingBy: 'maria'
    }
]);

.- Магия:

db.books.find().forEach(
    function (newBook) {
        newBook.category = db.categories.findOne( { "_id": newBook.category } );
        newBook.lendings = db.lendings.find( { "book": newBook._id  } ).toArray();
        newBook.authors = db.authors.find( { "_id": { $in: newBook.authors }  } ).toArray();
        db.booksReloaded.insert(newBook);
    }
);

.- Получить новые данные коллекции:

db.booksReloaded.find().pretty()

.- Ответ:)

{
    "_id" : "b1",
    "name" : "Groovy Book",
    "category" : {
        "_id" : "c1",
        "name" : "sci-fi"
    },
    "authors" : [
        {
            "_id" : "a1",
            "name" : {
                "first" : "orlando",
                "last" : "becerra"
            },
            "age" : 27
        }
    ],
    "lendings" : [
        {
            "_id" : "l1",
            "book" : "b1",
            "date" : ISODate("2011-01-01T00:00:00Z"),
            "lendingBy" : "jose"
        },
        {
            "_id" : "l2",
            "book" : "b1",
            "date" : ISODate("2012-02-02T00:00:00Z"),
            "lendingBy" : "maria"
        }
    ]
}
{
    "_id" : "b2",
    "name" : "Java Book",
    "category" : {
        "_id" : "c2",
        "name" : "romance"
    },
    "authors" : [
        {
            "_id" : "a1",
            "name" : {
                "first" : "orlando",
                "last" : "becerra"
            },
            "age" : 27
        },
        {
            "_id" : "a2",
            "name" : {
                "first" : "mayra",
                "last" : "sanchez"
            },
            "age" : 21
        }
    ],
    "lendings" : [ ]
}

Надеюсь, эти строки помогут вам.

1
задан Ivan avn 17 January 2019 в 15:55
поделиться

2 ответа

Это нормально, что пользователь может содержать такие методы, как: CreateDocument (params), SendDocumentForApproval (docId), ApproveApprovalStepOfDocument (stepId)?

В большинстве моделей доменов метод принадлежит к сущности, которая управляет государством, которое собирается измениться.

Document document = User.SendDocumentForApproval(command.DocId);
_documentRepository.Update(document);

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

document.SendDocumentForApproval(command.UserId)
_documentRepository.Update(document);

(Да, код не читается как письменный или разговорный английский.)

Когда создает новый документ ... шаблоны создания странные. Уди Дахан предполагает, что в вашей доменной модели всегда должна быть какая-то сущность, отвечающая за создание других сущностей, но я не уверен, что с результатом на самом деле легче работать в долгосрочной перспективе. [ 1111]

Как мы можем смоделировать бизнес-процесс утверждения

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

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

0
ответ дан VoiceOfUnreason 17 January 2019 в 15:55
поделиться

Вы движетесь в правильном направлении, пользователь и документ являются совокупными, поскольку они созданы в отдельных транзакциях. Когда речь заходит о том, кто на кого ссылается, принцип масштабируемости IDDD гласит, что агрегаты должны ссылаться на агрегаты только через их идентификаторы.

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

class User {
    private UserId id;
    private String name;    

    User(String name) {
        this.id = new UserId();
        this.name = name;            
    }

    Document createDocument(String name) {
        Document document = new Document(name);        
        document.createdBy(this);
        return document;
    }

    Document approve(Document document) {
        document.approved();
        return document;
    }
}

class Document {
    private DocumentId id;
    private String name;
    private UserId userId;
    private Boolean isApproved;

    Document(String name) {
        this.id = new DocumentId();
        this.name = name;
    }

    void createdBy(UserId userId) {
        this.userId = userId;
    }    

    void approved() {
        this.isApproved = true;
    }

}

// User creation
User user = new User("Someone");
userRepository.save(user);

//Document creation
User user = userRepository.find(new UserId("some-id"))
Document document = user.createDocument("important-document")
documentRepository.save(document)

// Approval
User user = userRepository.find(new UserId("some-id"))
Document document = documentRepository.find(new DocumentId("some-id")) 
document = user.approve(Document)

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

0
ответ дан Pankaj Sharma 17 January 2019 в 15:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: