0

我是事件溯源的新手,我正在尝试在我的简短应用程序中将事件存储实现为写入模型。我有一个包含以下代码的用户聚合:

public sealed class User : AggregateRoot
{
    internal User(Guid id,
        string login,
        byte[] password,
        string firstName,
        string lastName,
        string mailAddress)
        : base(id)
    {
        Login = login;
        Password = password;
        FirstName = firstName;
        LastName = lastName;
        MailAddress = mailAddress;
        Enqueue(new UserCreatedDomainEvent(id,
            Login,
            Password,
            FirstName,
            LastName,
            MailAddress));
    }

    private User()
        : base(Guid.Empty)
    {
    }

    public string Login { get; private set; }
    public byte[] Password { get; private set; }
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public string MailAddress { get; private set; }

    public void ChangePassword(byte[] password)
    {
        var areTheSame = Password == password;
    
        if (areTheSame)
        {
            return;
        }

        Password = password;
        Enqueue(new PasswordChangedDomainEvent(Id, Password));
    }

    private void Apply(UserCreatedDomainEvent @event)
    {
        Id = @event.EntityId;
        Login = @event.Login;
        Password = @event.Password;
        FirstName = @event.FirstName;
        LastName = @event.LastName;
        MailAddress = @event.MailAddress;
    }

    private void Apply(PasswordChangedDomainEvent @event) =>
        Password = @event.NewPassword;
}

在我创建一个新用户之前,我需要检查,是否已经登录。我知道如何重建具有特定 id 的聚合(我在这种情况下使用 AggregateStreamAsync 方法),但是这次我需要在注册新用户之前检查所有聚合的登录。如何实现这样的逻辑?感谢您的任何回答。

4

2 回答 2

0

您首先对您的读取端进行查询,以检查用户或电子邮件是否已经存在。您不会直接查询 event -store 以获取此类信息。

于 2021-04-21T08:10:29.993 回答
0

如此处所述您可以使用内联投影:

var store = DocumentStore.For(_ =>
{
    // This is all you need to create the User projected view
     _.Events.InlineProjections.AggregateStreamsWith<User>();
});

此时,您可以将User作为另一种文档类型进行查询。

于 2021-07-26T20:35:03.630 回答