-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
updated events to records, some renaming and restructuring
- Loading branch information
1 parent
d881157
commit 633633d
Showing
10 changed files
with
112 additions
and
62 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,6 @@ | ||
namespace StudentEnrollmentConsoleApp.Events; | ||
|
||
public abstract class Event | ||
public abstract record Event | ||
{ | ||
public abstract string StreamId { get; } | ||
|
||
public DateTime CreatedAtUtc { get; set; } | ||
public string Id { get; init; } = default!; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
using System.Collections.Concurrent; | ||
|
||
namespace StudentEnrollmentConsoleApp.Events; | ||
|
||
public class EventTypeMapper | ||
{ | ||
public static readonly EventTypeMapper Instance = new(); | ||
|
||
private readonly ConcurrentDictionary<string, Type?> _typeMap = new(); | ||
private readonly ConcurrentDictionary<Type, string> _typeNameMap = new(); | ||
|
||
public string ToName<TEventType>() => ToName(typeof(TEventType)); | ||
|
||
public string ToName(Type eventType) => _typeNameMap.GetOrAdd(eventType, _ => | ||
{ | ||
var eventTypeName = eventType.FullName!; | ||
_typeMap.TryAdd(eventTypeName, eventType); | ||
return eventTypeName; | ||
}); | ||
|
||
public Type? ToType(string eventTypeName) => _typeMap.GetOrAdd(eventTypeName, _ => | ||
{ | ||
var type = AppDomain.CurrentDomain | ||
.GetAssemblies() | ||
.SelectMany(a => a.GetTypes().Where(x => x.FullName == eventTypeName || x.Name == eventTypeName)) | ||
.FirstOrDefault(); | ||
|
||
if (type == null) | ||
return null; | ||
|
||
_typeNameMap.TryAdd(type, eventTypeName); | ||
|
||
return type; | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,9 @@ | ||
namespace StudentEnrollmentConsoleApp.Events; | ||
|
||
public class StudentCreated : Event | ||
public record StudentCreated : Event | ||
{ | ||
public required string StudentId { get; init; } | ||
public required string FullName { get; init; } | ||
public required string Email { get; init; } | ||
public required DateTime DateOfBirth { get; init; } | ||
|
||
public override string StreamId => StudentId; | ||
public DateTime CreatedAtUtc { get; init; } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
namespace StudentEnrollmentConsoleApp.Events; | ||
|
||
public record StudentEmailChanged : Event | ||
{ | ||
public required string Email { get; init; } | ||
public DateTime ChangedAtUtc { get; init; } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,7 @@ | ||
namespace StudentEnrollmentConsoleApp.Events; | ||
|
||
public class StudentEnrolled : Event | ||
public record StudentEnrolled : Event | ||
{ | ||
public required string StudentId { get; init; } | ||
public required string CourseName { get; init; } | ||
|
||
public override string StreamId => StudentId; | ||
public DateTime EnrolledAtUtc { get; init; } | ||
} |
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
namespace StudentEnrollmentConsoleApp.Events; | ||
|
||
public record StudentWithdrawn : Event | ||
{ | ||
public required string CourseName { get; init; } | ||
public DateTime WithdrawnAtUtc { get; init; } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,6 +3,12 @@ | |
using EventStore.Client; | ||
using StudentEnrollmentConsoleApp.Events; | ||
|
||
// Register events to a singleton for ease-of-reference | ||
EventTypeMapper.Instance.ToName(typeof(StudentCreated)); | ||
EventTypeMapper.Instance.ToName(typeof(StudentEnrolled)); | ||
EventTypeMapper.Instance.ToName(typeof(StudentWithdrawn)); | ||
EventTypeMapper.Instance.ToName(typeof(StudentEmailChanged)); | ||
|
||
var id = Guid.Parse("a662d446-4920-415e-8c2a-0dd4a6c58908"); | ||
var streamId = $"student-{id}"; | ||
|
||
|
@@ -11,10 +17,11 @@ | |
"StudentCreated", | ||
JsonSerializer.SerializeToUtf8Bytes(new StudentCreated | ||
{ | ||
StudentId = streamId, | ||
Id = streamId, | ||
FullName = "Erik Shafer", | ||
Email = "[email protected]", | ||
DateOfBirth = new DateTime(1987, 1, 1) | ||
DateOfBirth = new DateTime(1987, 1, 1), | ||
CreatedAtUtc = DateTime.UtcNow | ||
}) | ||
); | ||
|
||
|
@@ -23,19 +30,20 @@ | |
"StudentEnrolled", | ||
JsonSerializer.SerializeToUtf8Bytes(new StudentEnrolled | ||
{ | ||
StudentId = streamId, | ||
CourseName = "From Zero to Hero: REST APis in .NET" | ||
Id = streamId, | ||
CourseName = "From Zero to Hero: REST APis in .NET", | ||
EnrolledAtUtc = DateTime.UtcNow | ||
}) | ||
); | ||
|
||
var updated = new EventData( | ||
var emailChanged = new EventData( | ||
Uuid.NewUuid(), | ||
"StudentUpdated", | ||
JsonSerializer.SerializeToUtf8Bytes(new StudentUpdated | ||
"StudentEmailChanged", | ||
JsonSerializer.SerializeToUtf8Bytes(new StudentEmailChanged | ||
{ | ||
StudentId = streamId, | ||
FullName = "Erik Shafer", | ||
Email = "[email protected]", | ||
Id = streamId, | ||
Email = "[email protected]", | ||
ChangedAtUtc = DateTime.UtcNow | ||
}) | ||
); | ||
|
||
|
@@ -48,7 +56,7 @@ | |
await client.AppendToStreamAsync( | ||
streamId, | ||
StreamState.Any, | ||
new[] { created, enrolled, updated }, | ||
new[] { created, enrolled, emailChanged }, | ||
cancellationToken: default | ||
); | ||
|
||
|
@@ -62,21 +70,38 @@ await client.AppendToStreamAsync( | |
var eventStream = await readStreamResult.ToListAsync(); | ||
|
||
// Write out the events from the stream | ||
foreach (var @event in eventStream) | ||
Console.WriteLine("Events from selected stream: "); | ||
foreach (var resolved in eventStream) | ||
{ | ||
Console.WriteLine($"EventId: {@event.Event.EventId}"); | ||
Console.WriteLine($"EventStreamId: {@event.Event.EventStreamId}"); | ||
Console.WriteLine($"EventType: {@event.Event.EventType}"); | ||
Console.WriteLine($"Data: {Encoding.UTF8.GetString(@event.Event.Data.ToArray())}"); | ||
Console.WriteLine("---"); | ||
Console.WriteLine($"\tEventId: {resolved.Event.EventId}"); | ||
Console.WriteLine($"\tEventStreamId: {resolved.Event.EventStreamId}"); | ||
Console.WriteLine($"\tEventType: {resolved.Event.EventType}"); | ||
Console.WriteLine($"\tData: {Encoding.UTF8.GetString(resolved.Event.Data.ToArray())}"); | ||
Console.WriteLine(""); | ||
} | ||
|
||
// Write out all the courses the student enrolled in | ||
var enrolledCourses = eventStream | ||
.Where(re => re.Event.EventType == "StudentEnrolled") | ||
.Select(re => JsonSerializer.Deserialize<StudentEnrolled>(re.Event.Data.ToArray())) | ||
.Select(se => se!.CourseName) | ||
.ToArray(); | ||
.ToList(); | ||
Console.WriteLine("Courses enrolled in: "); | ||
enrolledCourses.ForEach(ec => Console.WriteLine($"\t- {ec}")); | ||
Console.WriteLine(""); | ||
|
||
// Write out using the mapper | ||
Console.WriteLine("Deserialized events:"); | ||
foreach (var resolved in eventStream) | ||
{ | ||
var eventType = EventTypeMapper.Instance.ToType(resolved.Event.EventType); | ||
|
||
if (eventType == null) | ||
break; | ||
|
||
var deserializedEvent = JsonSerializer.Deserialize(Encoding.UTF8.GetString(resolved.Event.Data.Span), eventType); | ||
|
||
Console.WriteLine($"\t{deserializedEvent}"); | ||
} | ||
|
||
Console.WriteLine($"Courses enrolled in: {enrolledCourses}"); | ||
Console.WriteLine(""); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters