小编Dmi*_*ich的帖子

事件采购和读取模型生成

假设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的样品.但在我看来,他们只使用事件中包含的数据.

domain-driven-design cqrs event-sourcing

28
推荐指数
2
解决办法
4412
查看次数

使用Unity 2.0的NServiceBus?

有人使用NServiceBus 2.0成功使用Unity 2.0吗?

我试图针对Unity 2.0程序集编译NServiceBus.ObjectBuilder.Unity.dll的源代码,但由于新Unity中许多对象方法的更改/删除签名,因此会出现几个编译时错误.

在文档中,Udi Dahan说附加任何容器就像实现5种方法一样简单IContainer.但是当我查看NServiceBus.ObjectBuilder.Unity实现时,我发现还有很多工作要做.为什么会这样?

.net nservicebus unity2.0

14
推荐指数
1
解决办法
1319
查看次数

准备View Model时如何"加入"两个聚合根?

假设BookAuthor是在我的模型总根源.

在阅读模型中,我有一个表格AuthorsAndBooks,其中列出了作者和书籍Book.AuthorId

BookAdded事件被触发时,我想要接收Author数据以创建新AuthorsAndBooks行.

因为Book是聚合根,所以有关信息Author不包含在BookAdded事件中.我不能包括它,因为Authorroot没有getter(根据所有关于CQRS和Event Sourcing的示例和帖子的指南).

通常我会在这个问题上收到两种答案:

  1. 使用事件处理程序中所需的所有数据丰富您的域事件.但正如我所说,我不能为Aggregates Roots做这件事.
  2. 使用View Model中的可用数据.即Author从View Model 加载并使用它来构建AuthorsAndBooks行.

最后一个在并发方面存在一些问题.BookAdded处理事件时,视图模型中无法使用作者数据.

你用什么方法来解决这个问题?谢谢.

cqrs event-sourcing

13
推荐指数
1
解决办法
2805
查看次数

当读取模型与事件日志不同步时,如何处理情况?

当聚合的快照与事件日志不同步时,我可以简单地从早期快照(应该是同步的)重放我的事件.当我添加/删除新字段或修改现有处理程序的逻辑时,我可以这样做.

如果我需要添加新的阅读模型(即新的报告视图),我可以再次做同样的事情 - 我将重播我的活动.

但是,当读取的模型与事件日志不同步时,我应该如何处理这种情况?事件和发布的存储在一个事务中,但读取模型的更新发生在另一个事务中,这可能会失败.从一开始就重复事件可能有所帮助,但它可能需要永恒.我是否需要整个读取模型的快照概念?

你怎么解决这个问题?谢谢.

cqrs event-sourcing

9
推荐指数
1
解决办法
1233
查看次数

使用Google实验性的OAuth 2.0实现访问现有的API端点

根据此文档,接收OAuth访问令牌的过程非常简单.我希望看到已准备好接受OAuth 2.0访问令牌的所有可用API端点的列表.但对于我目前的需求,我想以某种方式获得usernameemail使用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成功收到用户名和电子邮件?

authentication oauth google-api single-sign-on oauth-2.0

7
推荐指数
1
解决办法
3678
查看次数

RavenDB.如何加载内部集合中只有5个项目的文档?

这是商店里的一个文件:

{
    "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)

.net nosql document-database ravendb

5
推荐指数
1
解决办法
695
查看次数

Microsoft Unity中转发的类型

如何在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 是相同的实例.

.net castle-windsor unity-container

5
推荐指数
1
解决办法
331
查看次数

事件采购和字典对象

如何事件采购可与多种类型,如字典对象的组合Country,Region,Time Zone等和字典类型从像特定的域模型BudgetAvailability定义.一些字典对象应该可以在管理员界面中进行编辑,但有些则不行.

例如,我们决定,我们不需要国家/地区的管理UI.因此,我们不需要实现AddCountry/ RemoveCountry命令.

我应该生成一组CountryAdded事件,即我应该将字典对象保存为事件流吗?我们是否曾使用事件流以外的事实来源?


如果我可以没有字典对象的事件流,你将如何解决这个问题:

显示每个国家/地区的用户数量的国家/地区列表.

在这种情况下,我需要Country在读取模型中使用侦听器来表示对象UserAdded.

谢谢.

cqrs event-sourcing

3
推荐指数
1
解决办法
465
查看次数

RavenDB查询响应时间长,而在服务器上处理速度非常快

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 ravendb

2
推荐指数
1
解决办法
469
查看次数