领域模型是应用程序的核心,它包括了领域对象、状态、方法、事件、业务逻辑以及对象之间的关系。现在,我们来为Tiny Library CQRS创建一个领域模型项目。
- 在Solution Explorer下,右键单击TinyLibraryCQRS项目,单击Add | New Project…菜单,这将打开Add New Project对话框
- 在Installed Templates选项卡下,选择Visual C# | Windows,然后选择Class Library,确保所选的Framework版本是.NET Framework 4,在Name文本框中,输入TinyLibrary.Domain,然后单击OK按钮
- 在Solution Explorer下,右键单击TinyLibrary.Domain项目的References节点,单击Add Reference…菜单,这将打开Add Reference对话框
- 在.NET选项卡下,选择Apworks然后单击OK按钮
- 在TinyLibrary.Domain项目下,创建一个Book类,由于它是聚合根,因此使其继承于SourcedAggregateRoot类
1: using System;
2: using Apworks;
3: using Apworks.Snapshots;
4:
5: namespace TinyLibrary.Domain
6: {
7: public class Book : SourcedAggregateRoot
8: {
9: public string Title { get; private set; }
10: public string Publisher { get; private set; }
11: public DateTime PubDate { get; private set; }
12: public string ISBN { get; private set; }
13: public int Pages { get; private set; }
14: public bool Lent { get; private set; }
15:
16: public Book() : base() { }
17: public Book(long id) : base(id) { }
18:
19: protected override void DoBuildFromSnapshot(ISnapshot snapshot)
20: {
21: throw new NotImplementedException();
22: }
23:
24: protected override ISnapshot DoCreateSnapshot()
25: {
26: throw new NotImplementedException();
27: }
28: }
29: }
- 同理,在TinyLibrary.Domain项目下,创建一个Reader类
1: using System;
2: using System.Collections.Generic;
3: using Apworks;
4: using Apworks.Snapshots;
5:
6: namespace TinyLibrary.Domain
7: {
8: public class Reader : SourcedAggregateRoot
9: {
10: public string LoginName { get; private set; }
11: public string Name { get; private set; }
12: public List<Book> Books { get; private set; }
13:
14: public Reader() : base() { Books = new List<Book>(); }
15:
16: public Reader(long id) : base(id) { Books = new List<Book>(); }
17:
18: protected override void DoBuildFromSnapshot(ISnapshot snapshot)
19: {
20: throw new NotImplementedException();
21: }
22:
23: protected override ISnapshot DoCreateSnapshot()
24: {
25: throw new NotImplementedException();
26: }
27: }
28: }
从上面两段代码可以看出,有两个protected的方法我们还没有实现,这两个方法是定义在SourcedAggregateRoot基类中的,用来提供与“快照”相关的功能。“快照”是CQRS架构中非常重要的一部分,在下一章节中,我们将了解到,如何为我们的领域模型添加快照功能。