У меня есть совокупный репозиторий кэша моментальных снимков:
using Eventing.Core.Domain;
using Eventing.Core.Serialization;
using Microsoft.Extensions.Caching.Memory;
using System;
namespace Eventing.Core.Persistence
{
public class InMemorySnapshotClient : ISnapshotClient
{
private readonly MemoryCache cache;
private readonly TimeSpan timeToLive;
private readonly IJsonSerializer serializer;
public InMemorySnapshotClient(IJsonSerializer serializer)
: this(TimeSpan.FromMinutes(30), serializer)
{ }
public InMemorySnapshotClient(TimeSpan timeToLive, IJsonSerializer serializer)
{
Ensure.NotNull(serializer, nameof(serializer));
this.cache = new MemoryCache(new MemoryCacheOptions());
this.timeToLive = timeToLive;
this.serializer = serializer;
}
public void Cache(IEventSourced state)
{
// make a copy of the state values to avoid concurrency problems with reusing references.
var serialized = this.serializer.Serialize(state);
this.cache.Set(
key: state.StreamName,
value: serialized,
absoluteExpiration: DateTimeOffset.UtcNow.Add(this.timeToLive));
}
public bool TryGet(string streamName, out IEventSourced state)
{
var serialized = this.cache.Get(streamName);
if (serialized == null)
{
state = null;
return false;
}
state = this.serializer.Deserialize<IEventSourced>((string)serialized);
return true;
}
}
}
Пожалуйста, потерпите меня, и спасибо, что нашли время, чтобы прочитать код.Как вы можете видеть, я сериализовал / десериализовал объект, чтобы избежать проблем параллелизма, с JSON.net.Но .. мои вопросы таковы:
- Будет ли гораздо эффективнее фактически клонировать объект в другой экземпляр и кэшировать его как реальный объект?
- Есть ли преимущество в сохранении кэширования строкового представления объекта?Потому что на самом деле гораздо проще просто сериализовать его, чем реализовывать ICloneable во всех классах DTO / POCO.