如何解决如何从 Marten 中构建的事件商店中获取某种类型的聚合集合?
我是事件溯源的新手,我正在尝试在我的简短应用程序中实现一个事件存储作为写入模型。我有一个包含以下代码的用户聚合:
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 方法),但这次我需要在注册新用户之前检查所有聚合的登录。如何实现这样的逻辑?感谢您的回答。
解决方法
您首先对阅读方进行查询,以检查用户或电子邮件是否已存在。您不会直接查询 event -store 以获取此类信息。
,正如 here 所描述的,您可以使用内联投影:
var store = DocumentStore.For(_ =>
{
// This is all you need to create the User projected view
_.Events.InlineProjections.AggregateStreamsWith<User>();
});
此时,您可以将用户作为另一种文档类型进行查询。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。