实例介绍
本文介绍了一个基于事件驱动架构的解决方案,该方案采用了领域驱动设计(DDD)和命令查询责任分离(CQRS)。解决方案包含以下应用程序:
1. 生产者Web API接收命令产生域事件。同时接收查询并返回JSON。
2. 消费者控制台应用读取事件流,并将投影到MongoDB数据库。
3. 用于认证和生成JWT的Web API。
环境要求:
- Visual Studio 2017 + Update 3
- .NET CORE SDK 2.0
- Docker
环境设置:
如果您已经有了Kafka和MongoDB的有效连接,可以跳过此步骤,直接运行应用程序。
使用以下命令检查数据层是否准备就绪:
$ docker images
$ docker ps
运行应用程序有两种选项:通过Visual Studio 2017或使用dotnet core命令。
如何运行Bearer认证API:
$ dotnet run
导航至Swagger UI (例如 http://localhost:16024/swagger),提交以下凭据:
{
"username": "ivanpaulovich",
"password": "mysecret"
}
存储Bearer Token,因为您将需要该令牌值来登录生产者API。
如何运行消费者API:
$ dotnet run
请保持控制台应用运行以处理事件。
如何运行生产者API:
$ dotnet run
导航至Swagger UI (例如 http://localhost:14398/swagger)。
【实例截图】
【核心代码】
文件清单
└── event-sourcing-jambo-15ac2de003dead45ca25fc673f08aa7b7168350a
├── CODE_OF_CONDUCT.md
├── _config.yml
├── CONTRIBUTING.md
├── LICENSE
├── Producer.png
├── README.md
├── setup
│ ├── docker-compose.yml
│ ├── down-kafka-mongodb.sh
│ └── up-kafka-mongodb.sh
└── source
├── Auth
│ ├── Jambo.Auth.Application
│ │ ├── Commands
│ │ │ └── LoginCommand.cs
│ │ └── Jambo.Auth.Application.csproj
│ ├── Jambo.Auth.Infrastructure
│ │ ├── Jambo.Auth.Infrastructure.csproj
│ │ └── Properties
│ │ └── launchSettings.json
│ ├── Jambo.Auth.sln
│ └── Jambo.Auth.UI
│ ├── appsettings.Development.json
│ ├── appsettings.json
│ ├── Config.cs
│ ├── Controllers
│ │ └── AccountController.cs
│ ├── Dockerfile
│ ├── Jambo.Auth.UI.csproj
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ └── Startup.cs
├── Consumer
│ ├── Jambo.Consumer.Application
│ │ ├── DomainEventHandlers
│ │ │ ├── Blogs
│ │ │ │ ├── BlogCreatedEventHandler.cs
│ │ │ │ ├── BlogDisabledEventHandler.cs
│ │ │ │ ├── BlogEnabledEventHandler.cs
│ │ │ │ └── BlogUrlUpdatedEventHandler.cs
│ │ │ └── Posts
│ │ │ ├── CommentCreatedEventHandler.cs
│ │ │ ├── PostContentUpdatedEventHandler.cs
│ │ │ ├── PostCreatedEventHandler.cs
│ │ │ ├── PostDisabledEventHandler.cs
│ │ │ ├── PostEnabledEventHandler.cs
│ │ │ ├── PostHiddenDomainEventHandler.cs
│ │ │ └── PostPublishedDomainEventHandler.cs
│ │ └── Jambo.Consumer.Application.csproj
│ ├── Jambo.Consumer.Infrastructure
│ │ ├── DataAccess
│ │ │ ├── MongoContext.cs
│ │ │ └── Repositories
│ │ │ ├── Blogs
│ │ │ │ ├── BlogReadOnlyRepository.cs
│ │ │ │ └── BlogWriteOnlyRepository.cs
│ │ │ └── Posts
│ │ │ ├── PostReadOnlyRepository.cs
│ │ │ └── PostWriteOnlyRepository.cs
│ │ ├── Jambo.Consumer.Infrastructure.csproj
│ │ ├── Modules
│ │ │ ├── ApplicationModule.cs
│ │ │ ├── BusModule.cs
│ │ │ └── MediatRModule.cs
│ │ └── ServiceBus
│ │ └── Bus.cs
│ ├── Jambo.Consumer.sln
│ └── Jambo.Consumer.UI
│ ├── appsettings.json
│ ├── autofac.Development.json
│ ├── autofac.json
│ ├── Dockerfile
│ ├── Jambo.Consumer.UI.csproj
│ ├── Program.cs
│ └── Startup.cs
├── Producer
│ ├── Jambo.Producer.Application
│ │ ├── CommandHandlers
│ │ │ ├── Blogs
│ │ │ │ ├── CreateBlogCommandHandler.cs
│ │ │ │ ├── DisableBlogCommandHandler.cs
│ │ │ │ ├── EnableBlogCommandHandler.cs
│ │ │ │ └── UpdateBlogUrlCommandHandler.cs
│ │ │ └── Posts
│ │ │ ├── CreateCommentCommandHandler.cs
│ │ │ ├── CreatePostCommandHandler.cs
│ │ │ ├── DisablePostCommandHandler.cs
│ │ │ ├── EnablePostCommandHandler.cs
│ │ │ ├── HidePostCommandHandler.cs
│ │ │ ├── PublishPostCommandHandler.cs
│ │ │ └── UpdateContentCommandHandler.cs
│ │ ├── Commands
│ │ │ ├── Blogs
│ │ │ │ ├── CreateBlogCommand.cs
│ │ │ │ ├── DisableBlogCommand.cs
│ │ │ │ ├── EnableBlogCommand.cs
│ │ │ │ └── UpdateBlogUrlCommand.cs
│ │ │ ├── CommandBase.cs
│ │ │ └── Posts
│ │ │ ├── CreateCommentCommand.cs
│ │ │ ├── CreatePostCommand.cs
│ │ │ ├── DisablePostCommand.cs
│ │ │ ├── EnablePostCommand.cs
│ │ │ ├── HidePostCommand.cs
│ │ │ ├── PublishPostCommand.cs
│ │ │ └── UpdatePostContentCommand.cs
│ │ ├── Jambo.Producer.Application.csproj
│ │ └── Queries
│ │ ├── IBlogQueries.cs
│ │ └── IPostQueries.cs
│ ├── Jambo.Producer.Infrastructure
│ │ ├── DataAccess
│ │ │ ├── MongoContext.cs
│ │ │ └── Repositories
│ │ │ ├── Blogs
│ │ │ │ └── BlogReadOnlyRepository.cs
│ │ │ └── Posts
│ │ │ └── PostReadOnlyRepository.cs
│ │ ├── Jambo.Producer.Infrastructure.csproj
│ │ ├── Modules
│ │ │ ├── ApplicationModule.cs
│ │ │ ├── BusModule.cs
│ │ │ ├── MediatRModule.cs
│ │ │ └── QueriesModule.cs
│ │ ├── Properties
│ │ │ └── launchSettings.json
│ │ ├── Queries
│ │ │ ├── BlogQueries.cs
│ │ │ └── PostQueries.cs
│ │ └── ServiceBus
│ │ └── Bus.cs
│ ├── Jambo.Producer.sln
│ └── Jambo.Producer.UI
│ ├── appsettings.Development.json
│ ├── appsettings.json
│ ├── autofac.Development.json
│ ├── autofac.json
│ ├── Controllers
│ │ ├── BlogsController.cs
│ │ └── PostsController.cs
│ ├── Dockerfile
│ ├── Filters
│ │ ├── CorrelationFilter.cs
│ │ ├── DomainExceptionFilter.cs
│ │ └── ValidateModelAttribute.cs
│ ├── Jambo.Producer.UI.csproj
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ └── Startup.cs
└── Shared
├── Jambo.Domain
│ ├── Exceptions
│ │ ├── DomainException.cs
│ │ ├── JamboException.cs
│ │ └── TransactionConflictException.cs
│ ├── Jambo.Domain.csproj
│ ├── Model
│ │ ├── AggregateRoot.cs
│ │ ├── Blogs
│ │ │ ├── Blog.cs
│ │ │ ├── Events
│ │ │ │ ├── BlogCreatedDomainEvent.cs
│ │ │ │ ├── BlogDisabledDomainEvent.cs
│ │ │ │ ├── BlogEnabledDomainEvent.cs
│ │ │ │ └── BlogUrlUpdatedDomainEvent.cs
│ │ │ ├── IBlogReadOnlyRepository.cs
│ │ │ ├── IBlogWriteOnlyRepository.cs
│ │ │ └── Url.cs
│ │ ├── DomainEvent.cs
│ │ ├── Entity.cs
│ │ ├── Header.cs
│ │ ├── IDomainEvent.cs
│ │ ├── IEntity.cs
│ │ └── Posts
│ │ ├── Comment.cs
│ │ ├── CommentShouldNotBeEmptyException.cs
│ │ ├── Content.cs
│ │ ├── ContentShouldNotBeEmptyException.cs
│ │ ├── Events
│ │ │ ├── CommentCreatedDomainEvent.cs
│ │ │ ├── PostContentUpdatedDomainEvent.cs
│ │ │ ├── PostCreatedDomainEvent.cs
│ │ │ ├── PostDisabledDomainEvent.cs
│ │ │ ├── PostEnabledDomainEvent.cs
│ │ │ ├── PostHiddenDomainEvent.cs
│ │ │ └── PostPublishedDomainEvent.cs
│ │ ├── IPostReadOnlyRepository.cs
│ │ ├── IPostWriteOnlyRepository.cs
│ │ ├── Post.cs
│ │ ├── Title.cs
│ │ └── TitleShouldNotBeEmptyException.cs
│ └── ServiceBus
│ ├── IPublisher.cs
│ └── ISubscriber.cs
└── Jambo.Domain.UnitTests
├── Jambo.Domain.UnitTests.csproj
└── ValueObjectsTests.cs
56 directories, 144 files
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论