gpt4 book ai didi

c# - 使用 Redis 和 C# 存储从基类继承的类集合

转载 作者:IT王子 更新时间:2023-10-29 06:16:09 25 4
gpt4 key购买 nike

我正在尝试使用 C# 和 [ServiceStack] Redis 创建一个简单的事件存储。

public class AggregateEvents
{
public Guid Id { get; set;}
public List<DomainEvent> Events { get; set; }
}

public abstract class DomainEvent { }

public class UserRegisteredEvent : DomainEvent
{
public Guid UserId { get; set; }
public string Name { get; set; }
}

public class UserPromotedEvent : DomainEvent
{
public Guid UserId { get; set; }
public string NewRole { get; set; }
}

如果我执行 roots.GetAll() 我会得到一个异常,因为无法实例化抽象类。如果我改为将基类转换为接口(interface),则 Events 对象为 null,我存储在其中的对象将丢失。

有什么想法吗?

编辑1

使用 v3.03 和这段代码没有乐趣:

    [Test]
public void foo()
{
var client = new RedisClient("localhost");
var users = client.GetTypedClient<AggregateEvents>();


var userId = Guid.NewGuid();

var eventsForUser = new AggregateEvents
{
Id = userId,
Events = new List<DomainEvent>()
};

eventsForUser.Events.Add(new UserPromotedEvent { UserId = userId });


users.Store(eventsForUser);

var all = users.GetAll(); // exception
}

编辑2

也不适用于这种方法;

    [Test]
public void foo()
{
var userId = Guid.NewGuid();
var client = new RedisClient("localhost");

client.As<DomainEvent>().Lists["urn:domainevents-" + userId].Add(new UserPromotedEvent {UserId= userId});


var users = client.As<DomainEvent>().Lists["urn:domainevents-" + userId];

foreach (var domainEvent in users) // exception
{

}
}

最佳答案

能否用最新版本(v3.05+)的ServiceStack Redis客户端再试一次:

https://github.com/ServiceStack/ServiceStack.Redis/downloads

客户端使用的 ServiceStack Json Serializer 刚刚添加了对抽象/接口(interface)类型反序列化的支持,这将在最新版本的客户端中出现。

注意:这是通过将 __type 信息嵌入到 JSON 有效载荷中来实现的,该信息告诉序列化器它应该反序列化到哪个具体类中。它仅为抽象/接口(interface)/对象类型嵌入此信息。所以你在序列化时需要转换为抽象类型,例如:

redis.Store((DomainEvent)userPromoEvent);

或者如果添加到列表:

redis.As<DomainEvent>().Lists["urn:domainevents"].Add(userPromoEvent);

这些示例现在按照新添加的 DomainEvents Unit Tests 的指示工作:)

[Test]
public void Can_Retrieve_DomainEvents()
{
var userId = Guid.NewGuid();
var client = new RedisClient("localhost");
client.FlushAll();

client.As<DomainEvent>().Lists["urn:domainevents-" + userId].Add(
new UserPromotedEvent { UserId = userId });

var users = client.As<DomainEvent>().Lists["urn:domainevents-" + userId];

Assert.That(users.Count, Is.EqualTo(1));

var userPromoEvent = (UserPromotedEvent)users[0];
Assert.That(userPromoEvent.UserId, Is.EqualTo(userId));
}


[Test]
public void Can_from_Retrieve_DomainEvents_list()
{
var client = new RedisClient("localhost");
var users = client.As<AggregateEvents>();

var userId = Guid.NewGuid();

var eventsForUser = new AggregateEvents
{
Id = userId,
Events = new List<DomainEvent>()
};

eventsForUser.Events.Add(new UserPromotedEvent { UserId = userId });

users.Store(eventsForUser);

var all = users.GetAll();
}

关于c# - 使用 Redis 和 C# 存储从基类继承的类集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8140682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com