[DataContract(Name = "c94513d1-e5ee-4aae-8c0f-6e85b63a4e03")]
public class TaskProjection : ProjectionDefinition<TaskProjectionData, TaskId>,
IEventHandler<TaskCreated>
{
public TaskProjection()
{
Subscribe<TaskCreated>(x => new TaskId(x.Id.NID));
}
public Task HandleAsync(TaskCreated @event)
{
Data task = new Data();
task.Id = @event.Id;
task.UserId = @event.UserId;
task.Name = @event.Name;
task.Timestamp = @event.Timestamp;
State.Tasks.Add(task);
return Task.CompletedTask;
}
public IEnumerable<Data> GetTaskByName(string name)
{
return State.Tasks.Where(x => x.Name.Equals(name));
}
}[DataContract(Name = "c135893e-b9e3-453a-b0e0-53545094ec5d")]
public class TaskProjectionData
{
public TaskProjectionData()
{
Tasks = new List<Data>();
}
[DataMember(Order = 1)]
public List<Data> Tasks { get; set; }
[DataContract(Name = "317b3cbb-593a-4ffc-8284-d5f5c599d8ae")]
public class Data
{
[DataMember(Order = 1)]
public TaskId Id { get; set; }
[DataMember(Order = 2)]
public UserId UserId { get; set; }
[DataMember(Order = 3)]
public string Name { get; set; }
[DataMember(Order = 4)]
public DateTimeOffset CreatedAt { get; set; }
[DataMember(Order = 5)]
public DateTimeOffset Timestamp { get; set; }
}
}// TODO: give a relevant example
[DataContract(Name = "af157a4d-7608-4c9d-8e42-63bd483a8ad4")]
public class ExampleEfProjection : IProjection,
IEventHandler<ExampleCreated>
{
public DbContext Context { get; set; }
public void Handle(ExampleCreated @event)
{
var exampleDto = new ExampleDto(@event.Id, @event.Name);
Context.Examples.Add(exampleDto);
Context.SaveChanges();
}
}// TODO: give a relevant example
[DataContract(Name = "bae8bd10-9903-4960-95c4-b4fa4688a860")]
public class ExampleByIdProjection : ProjectionDefinition<ExampleByIdProjectionState, ExampleId>,
IEventHandler<ExampleCreated>,
IAmNotSnapshotable
{
// ...
}public class GetExampleController : ControllerBase
{
private IProjectionReader projectionReader;
public GetExampleController(IProjectionReader projectionReader)
{
this.projectionReader = projectionReader;
}
public async Task<IActionResult> GetExample(GetExampleRequest request)
{
var id = ExampleId.New(request.Tenant, request.Id);
var result = await projectionReader.GetAsync<ExampleByIdProjection>(id);
if (result.IsSuccess)
return Ok(new GetExampleResponse(result.Data.State));
else
return BadRequest(result.Error);
}
public class GetExampleResponse
{
// ...
}
}[DataContract(Name = "a44e9a38-ab13-4f86-844a-86fefa925b53")]
public class AlertPort : IPort,
IEventHandler<UserCreated>
{
public Task HandleAsync(UserCreated @event)
{
//Implement your custom logic here
return Task.CompletedTask;
}
}public class ConcertAppService : AggregateRootApplicationService<Concert>,
ICommandHandler<AnnounceConcert>,
ICommandHandler<RegisterPerformer>
{
...
public void Handle(AnnounceConcert command)
{
if (Repository.TryLoad<Concert>(command.Id, out _))
return;
var concert = new Concert(...);
Repository.Save(concert);
}
public void Handle(RegisterPerformer command)
{
Update(command.Id, x => x.RegisterPerformer(...));
}
...
}[DataContract(Name = "d4eb8803-2cc7-48dd-9ca1-4512b8d9b88f")]
public class TaskSaga : Saga,
IEventHandler<UserCreated>,
ISagaTimeoutHandler<Message>
{
public TaskSaga(IPublisher<ICommand> commandPublisher, IPublisher<IScheduledMessage> timeoutRequestPublisher) : base(commandPublisher, timeoutRequestPublisher)
{
}
public Task HandleAsync(UserCreated @event)
{
var message = new Message();
message.Info = @event.Name + "was created yesterday.";
message.PublishAt = DateTimeOffset.UtcNow.AddDays(1).DateTime;
message.Timestamp = DateTimeOffset.UtcNow;
RequestTimeout<Message>(message);
return Task.CompletedTask;
}
public Task HandleAsync(Message sagaTimeout)
{
Console.WriteLine(sagaTimeout.Info);
return Task.CompletedTask;
}
}
[DataContract(Name = "543e8e28-0dcb-4d41-98de-f701e403dbb2")]
public class Message : IScheduledMessage
{
public string Info { get; set; }
public DateTime PublishAt { get; set; }
public DateTimeOffset Timestamp { get; set; }
}