Example #1
0
        private static IConsumer <OrderKey, OrderEventRecord> CreateConsumer(
            ISchemaRegistryClient registryClient)
        {
            var deserializerBuilder = new BinaryDeserializerBuilder(
                BinaryDeserializerBuilder.CreateDefaultCaseBuilders()
                .Prepend(builder => new OrderEventUnionDeserializerBuilderCase(builder)));

            return(new ConsumerBuilder <OrderKey, OrderEventRecord>(
                       new ConsumerConfig
            {
                BootstrapServers = BootstrapServers,
                EnableAutoCommit = false,
                GroupId = $"union-type-example-{Guid.NewGuid()}",
            })
                   .SetAvroKeyDeserializer(registryClient)
                   .SetValueDeserializer(new AsyncSchemaRegistryDeserializer <OrderEventRecord>(
                                             registryClient,
                                             deserializerBuilder).AsSyncOverAsync())
                   .Build());
        }
        public void SelectedTypes()
        {
            var schema = new RecordSchema(nameof(EventContainer))
            {
                Fields = new[]
                {
                    new RecordField(
                        "event",
                        new UnionSchema(new[]
                    {
                        new RecordSchema(nameof(OrderCreatedEvent))
                        {
                            Fields = new[]
                            {
                                new RecordField("timestamp", new StringSchema()),
                                new RecordField(
                                    "total",
                                    new BytesSchema()
                                {
                                    LogicalType = new DecimalLogicalType(5, 2),
                                }),
                            },
                        },
                        new RecordSchema(nameof(OrderCancelledEvent))
                        {
                            Fields = new[]
                            {
                                new RecordField("timestamp", new StringSchema()),
                            },
                        },
                    })),
                },
            };

            var deserialize = new BinaryDeserializerBuilder(BinaryDeserializerBuilder
                                                            .CreateDefaultCaseBuilders()
                                                            .Prepend(builder => new OrderDeserializerBuilderCase(builder)))
                              .BuildDelegate <EventContainer>(schema);

            var serialize = new BinarySerializerBuilder(BinarySerializerBuilder
                                                        .CreateDefaultCaseBuilders()
                                                        .Prepend(builder => new OrderSerializerBuilderCase(builder)))
                            .BuildDelegate <EventContainer>(schema);

            var creation = new EventContainer
            {
                Event = new OrderCreatedEvent
                {
                    Timestamp = DateTime.UtcNow,
                    Total     = 40M,
                },
            };

            var cancellation = new EventContainer
            {
                Event = new OrderCancelledEvent
                {
                    Timestamp = DateTime.UtcNow,
                },
            };

            using (stream)
            {
                serialize(creation, new BinaryWriter(stream));

                var reader = new BinaryReader(stream.ToArray());

                var result = deserialize(ref reader);
                Assert.IsType <OrderCreatedEvent>(result.Event);

                stream.Position = 0;
                serialize(cancellation, new BinaryWriter(stream));

                reader = new BinaryReader(stream.ToArray());

                result = deserialize(ref reader);
                Assert.IsType <OrderCancelledEvent>(result.Event);
            }
        }