public static Task Execute <T, TRepository>(this AggregateRootCommandExecutor <T, TRepository> executor, Envelope envelope, Func <IKey, T> handler) where T : AggregateRoot where TRepository : IRepository <T, IKey> { return(executor.Execute(() => { IKey userKey; if (!envelope.Metadata.TryGet("UserKey", out userKey)) { if (envelope.Metadata.TryGet("UserId", out string userId)) { userKey = StringKey.Create(userId, "User"); } else { userKey = StringKey.Empty("User"); } } T model = handler(userKey); foreach (IEvent item in model.Events) { if (item is UserEvent payload) { payload.UserKey = userKey; } } return model; })); }
public void Load(IReadOnlyKeyValueCollection storage, object output) { // TODO: Not TryGet, UserKey is required! if (output is UserEvent payload) { if (storage.TryGet(Name.UserKey, out IKey userKey)) { payload.UserKey = userKey; } else { payload.UserKey = StringKey.Empty("User"); } } }
public bool TryGet <T>(string key, out T value) { if (storage.TryGetValue(key, out object target)) { if (target == null) { value = default(T); return(true); } log.Debug($"Get: Key: '{key}', RequiredType: '{typeof(T).FullName}', ActualType: '{target.GetType().FullName}'."); if (target is T targetValue) { value = targetValue; return(true); } if (typeof(T) == typeof(int) && target.GetType() == typeof(long)) { value = (T)(object)(int)(long)target; return(true); } if (typeof(T) == typeof(decimal) && target.GetType() == typeof(double)) { value = (T)(object)(decimal)(double)target; return(true); } if (typeof(T) == typeof(IKey) && target is JsonObject json) { string type = (string)json["Type"]; if (json.TryGetValue("Guid", out object rawGuid)) { if (rawGuid == null) { value = (T)(object)GuidKey.Empty(type); } else { value = (T)(object)GuidKey.Create(Guid.Parse((string)rawGuid), type); } return(true); } else if (json.TryGetValue("Identifier", out object rawIdentifier)) { if (rawIdentifier == null) { value = (T)(object)StringKey.Empty(type); } else { value = (T)(object)StringKey.Create((string)rawIdentifier, type); } return(true); } } if (typeof(T) == typeof(Color) && target is string rawColor) { byte[] parts = rawColor.Split(new char[] { ';' }).Select(p => Byte.Parse(p)).ToArray(); value = (T)(object)Color.FromArgb(parts[0], parts[1], parts[2], parts[3]); log.Debug($"Get: Color: '{value}'."); return(true); } if (typeof(T) == typeof(Price) && target is JsonObject priceJson) { log.Debug($"Get: Price value type: '{priceJson["Value"].GetType().FullName}'."); decimal priceValue = (decimal)(double)priceJson["Value"]; string priceCurrency = (string)priceJson["Currency"]; value = (T)(object)new Price(priceValue, priceCurrency); return(true); } if (typeof(T) == typeof(DateTime) && target is string rawDateTime) { if (DateTime.TryParse(rawDateTime, out DateTime dateTime)) { value = (T)(object)dateTime; return(true); } else { log.Warning($"Get: Key: '{key}' not parseable to datetime from value '{rawDateTime}'."); value = default(T); return(false); } } } log.Debug($"Get: Key: '{key}' NOT FOUND."); value = default(T); return(false); }
public bool TryGet <T>(string key, out T value) { if (storage.TryGetValue(key, out object target)) { if (target == null) { value = default(T); return(true); } log.Debug($"Get: Key: '{key}', RequiredType: '{typeof(T).FullName}', ActualType: '{target.GetType().FullName}'."); if (target is T targetValue) { value = targetValue; return(true); } JsonElement element = (JsonElement)target; if (typeof(T) == typeof(string)) { value = (T)(object)element.GetString(); return(true); } if (typeof(T) == typeof(int)) { value = (T)(object)element.GetInt32(); return(true); } if (typeof(T) == typeof(long)) { value = (T)(object)element.GetInt64(); return(true); } if (typeof(T) == typeof(decimal)) { value = (T)(object)element.GetDecimal(); return(true); } if (typeof(T) == typeof(double)) { value = (T)(object)element.GetDouble(); return(true); } if (typeof(T) == typeof(bool)) { value = (T)(object)element.GetBoolean(); return(true); } if (typeof(T) == typeof(IKey)) { if (element.ValueKind == JsonValueKind.Null) { value = default(T); return(true); } string type = element.GetProperty("Type").GetString(); if (element.TryGetProperty("Guid", out JsonElement rawGuid)) { string rawGuidValue = rawGuid.GetString(); if (rawGuidValue == null) { value = (T)(object)GuidKey.Empty(type); } else { value = (T)(object)GuidKey.Create(Guid.Parse(rawGuidValue), type); } return(true); } else if (element.TryGetProperty("Identifier", out JsonElement rawIdentifier)) { string rawIdentifierValue = rawIdentifier.GetString(); if (rawIdentifierValue == null) { value = (T)(object)StringKey.Empty(type); } else { value = (T)(object)StringKey.Create(rawIdentifierValue, type); } return(true); } } if (typeof(T) == typeof(Color)) { byte[] parts = element.GetString().Split(new char[] { ';' }).Select(p => Byte.Parse(p)).ToArray(); value = (T)(object)Color.FromArgb(parts[0], parts[1], parts[2], parts[3]); log.Debug($"Get: Color: '{value}'."); return(true); } if (typeof(T) == typeof(Price)) { log.Debug($"Get: Price value type: '{element.GetProperty("Value").GetType().FullName}'."); decimal priceValue = element.GetProperty("Value").GetDecimal(); string priceCurrency = element.GetProperty("Currency").GetString(); value = (T)(object)new Price(priceValue, priceCurrency); return(true); } if (typeof(T) == typeof(DateTime)) { string rawDateTime = element.GetString(); if (DateTime.TryParse(rawDateTime, out DateTime dateTime)) { value = (T)(object)dateTime; return(true); } else { log.Warning($"Get: Key: '{key}' not parseable to datetime from value '{rawDateTime}'."); value = default(T); return(false); } } } log.Debug($"Get: Key: '{key}' NOT FOUND. Storage: '{JsonSerializer.Serialize(storage)}'."); value = default(T); return(false); }