假设Stack Overflow域问题和以下事件定义:
UserRegistered(UserId, Name, Email)
UserNameChanged(UserId, Name)
QuestionAsked(UserId, QuestionId, Title, Question)
Run Code Online (Sandbox Code Playgroud)
假设事件存储的状态如下(按出现顺序):
1) UserRegistered(1, "John", "john@gmail.com")
2) UserNameChanged(1, "SuperJohn")
3) UserNameChanged(1, "John007")
4) QuestionAsked(1, 1, "Help!", "Please!")
Run Code Online (Sandbox Code Playgroud)
假设以下非规范化读取模型列出问题列表(对于SO的第一页):
QuestionItem(UserId, QuestionId, QuestionTitle, Question, UserName)
Run Code Online (Sandbox Code Playgroud)
以下事件处理程序(构建非规范化读取模型):
public class QuestionEventsHandler
{
public void Handle(QuestionAsked question)
{
var item = new QuestionItem(
question.UserId,
question.QuestionId,
question.Title,
question.Question,
??? /* how should i get name of the user? */);
...
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何找到提出问题的用户的姓名?或者更常见的是:如果我的非规范化读取模型需要在特定事件中不存在的附加数据,我应该如何处理事件?
我已经研究CQRS包括现有的样本SimpleSQRS格雷格年轻的Fohjin马克Nijhof的样品.但在我看来,他们只使用事件中包含的数据.
有人使用NServiceBus 2.0成功使用Unity 2.0吗?
我试图针对Unity 2.0程序集编译NServiceBus.ObjectBuilder.Unity.dll的源代码,但由于新Unity中许多对象方法的更改/删除签名,因此会出现几个编译时错误.
在文档中,Udi Dahan说附加任何容器就像实现5种方法一样简单IContainer.但是当我查看NServiceBus.ObjectBuilder.Unity实现时,我发现还有很多工作要做.为什么会这样?
假设Book和Author是在我的模型总根源.
在阅读模型中,我有一个表格AuthorsAndBooks,其中列出了作者和书籍Book.AuthorId
当BookAdded事件被触发时,我想要接收Author数据以创建新AuthorsAndBooks行.
因为Book是聚合根,所以有关信息Author不包含在BookAdded事件中.我不能包括它,因为Authorroot没有getter(根据所有关于CQRS和Event Sourcing的示例和帖子的指南).
通常我会在这个问题上收到两种答案:
Author从View Model 加载并使用它来构建AuthorsAndBooks行.最后一个在并发方面存在一些问题.BookAdded处理事件时,视图模型中无法使用作者数据.
你用什么方法来解决这个问题?谢谢.
当聚合的快照与事件日志不同步时,我可以简单地从早期快照(应该是同步的)重放我的事件.当我添加/删除新字段或修改现有处理程序的逻辑时,我可以这样做.
如果我需要添加新的阅读模型(即新的报告视图),我可以再次做同样的事情 - 我将重播我的活动.
但是,当读取的模型与事件日志不同步时,我应该如何处理这种情况?事件和发布的存储在一个事务中,但读取模型的更新发生在另一个事务中,这可能会失败.从一开始就重复事件可能有所帮助,但它可能需要永恒.我是否需要整个读取模型的快照概念?
你怎么解决这个问题?谢谢.
根据此文档,接收OAuth访问令牌的过程非常简单.我希望看到已准备好接受OAuth 2.0访问令牌的所有可用API端点的列表.但对于我目前的需求,我想以某种方式获得username和email使用OAuth 2.0访问令牌的用户.
我成功地可以接收来自此端点的数据:
https://www.google.com/m8/feeds/contacts/default/full
Run Code Online (Sandbox Code Playgroud)
但无法从此端点接收数据:
https://www.googleapis.com/userinfo/email
Run Code Online (Sandbox Code Playgroud)
我尝试了传递单一访问令牌的header-base和querystring-base方法.这是我试过的标题:
Authorization: OAuth My_ACCESS_TOKEN
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过OAuth 1.0版本的Authorization标头,但是......在OAuth 2.0中,我们没有秘密访问令牌.Google在其OAuth 2.0实施中使用了承载令牌,因此无需其他凭据.
是否有人使用Google OAuth 2.0成功收到用户名和电子邮件?
这是商店里的一个文件:
{
"Name": "Hibernating Rhinos",
"Employees": [
{ "Name": "Ayende" },
{ "Name": "John" },
{ "Name": "Bob" },
{ "Name": "Tom" },
{ "Name": "Lane" },
{ "Name": "Bill" },
{ "Name": "Tad" }
]
}
Run Code Online (Sandbox Code Playgroud)
使用或不使用Employees集合可以轻松加载此文档,但如何只加载内部集合的一部分?例如,前5项:
{
"Name": "Hibernating Rhinos",
"Employees": [
{ "Name": "Ayende" },
{ "Name": "John" },
{ "Name": "Bob" },
{ "Name": "Tom" },
{ "Name": "Lane" }
]
}
Run Code Online (Sandbox Code Playgroud) 如何在Unity Framework中将单个组件用于多个服务?
在Windsor中,它按以下方式配置:
var container = new WindsorContainer();
container.Register(Component.For<Service1, Service2>()
.ImplementedBy<Component>());
var service1 = container.Resolve<Service1>();
var service2 = container.Resolve<Service2>();
Run Code Online (Sandbox Code Playgroud)
转发类型的想法是,如果组件是单例service1并且service2 是相同的实例.
如何事件采购可与多种类型,如字典对象的组合Country,Region,Time Zone等和字典类型从像特定的域模型Budget或Availability定义.一些字典对象应该可以在管理员界面中进行编辑,但有些则不行.
例如,我们决定,我们不需要国家/地区的管理UI.因此,我们不需要实现AddCountry/ RemoveCountry命令.
我应该生成一组CountryAdded事件,即我应该将字典对象保存为事件流吗?我们是否曾使用事件流以外的事实来源?
如果我可以没有字典对象的事件流,你将如何解决这个问题:
显示每个国家/地区的用户数量的国家/地区列表.
在这种情况下,我需要Country在读取模型中使用侦听器来表示对象UserAdded.
谢谢.
Raven.Server启动并绑定到端口8022.我按以下方式初始化DataStore:
var store = new DocumentStore() { Url = "http://localhost:8022" };
store.Initialize();
Run Code Online (Sandbox Code Playgroud)
然后我正在做这样的查询:
using (var session = store.OpenSession())
{
Stopwatch watch = new Stopwatch();
watch.Start();
var result = session.LuceneQuery<Item>("Raven/DocumentsByEntityName")
.WhereEquals("Tag", "Items")
.ToList();
watch.Stop(); // watch.ElapsedMilliseconds == ~550 ms
return result;
}
Run Code Online (Sandbox Code Playgroud)
并且watch.ElapsedMilliseconds总是~550毫秒.但是当我查看RavenDB控制台时,我看到该查询在3毫秒内处理完毕:
Request # 170: GET - 3 ms - 200 - /indexes/Raven/DocumentsByEntityName?query=Tag%253A%255B%255BItems%255D%255D&start=0&pageSize=128
Run Code Online (Sandbox Code Playgroud)
因此,大约99.5%的时间不在RavenDB中.问题是什么?(RavenDB 147)
当我切换到RavenDB的自托管(即作为嵌入式客户端)时,一切都还可以(~3ms).
为了澄清该问题不在网络,http调试器,DNS服务器等.我也测试了这个:
Stopwatch watch = new Stopwatch();
watch.Start();
WebClient client = new WebClient();
var result = client.DownloadString("http://127.0.0.1:8022/indexes/Raven/DocumentsByEntityName?query=Tag%253A%255B%255BItems%255D%255D&start=0&pageSize=128");
watch.Stop(); // watch.ElapsedMilliseconds == ~3-10ms
Run Code Online (Sandbox Code Playgroud)
快速.但切换到Raven.Client.Lightweight会增加响应时间200次(550-600 …
.net ×4
cqrs ×4
ravendb ×2
google-api ×1
nosql ×1
nservicebus ×1
oauth ×1
oauth-2.0 ×1
unity2.0 ×1