public class ContactDomainEventProducer : IDomainEventProducer
public ContactDomainEventProducer()
public async Task<bool> PublishCreatedEventAsync(BigCustomer customer, int contactId, BigContact? contact, BigContactExtra? contactExtra)
contact = BigContact.GetById(customer, contactId);
if (contactExtra == null)
contactExtra = BigContactExtra.GetById(customer, contactId);
var payload = new ContactCreatedPayloadV1()
Name = contact.ContactName,
Town = contact.ContactTown
var domainEvent = DomainEvent.Create<ContactCreatedPayloadV1>(MessageType.ContactCreated, payload, customer.CustomerId, "1.0");
return await this.PublishEventAsync(domainEvent);
private async Task<bool> PublishEventAsync(DomainEvent payload)
public MessageType Type { get; }
public dynamic Message { get; }
public int CustomerId { get; }
public string Originator { get; }
public string Version { get; } = "1.0";
public Guid EventId { get; }
public DateTime Timestamp { get; }
private DomainEvent(MessageType type, dynamic message, int customerId, string originator)
this.CustomerId = customerId;
this.Originator = originator;
this.EventId = Guid.NewGuid();
this.Timestamp = DateTime.UtcNow;
public static DomainEvent Create<T>(MessageType type, T message, int customerId, string originator)
return new DomainEvent(type, message, customerId, originator);
public class ContactCreatedPayloadV1
public int Id { get; set; }
public string Name { get; set; }
public string Town { get; set; }