public static void AddEventStore <TId>(this AggregateOPFactory <TId> factory)
        {
            var eventModelType = factory.EventModelType;

            var eventDeserializers = factory._assemblies
                                     .SelectMany(s => s.GetTypes())
                                     .Where(p => typeof(IEvent <TId>).IsAssignableFrom(p) && p != typeof(IEvent <TId>))
                                     .ToDictionary(
                t => t.Name,
                t =>
            {
                var deserializer = typeof(JsonEventDeserializer <,>);
                deserializer     = deserializer.MakeGenericType(t, typeof(TId));

                var method = deserializer.GetMethod("Deserialize", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod);

                IEvent <TId> factory(string json) => method.Invoke(null, new[] { json }).CastToReflected(t);

                Func <string, object, long, long, EventModel <TId> > makeModel = (string json, object metadata, long position, long version) =>
                {
                    var genericModel = eventModelType;
                    genericModel     = genericModel.MakeGenericType(t, typeof(TId));

                    var e = factory(json);

                    var model = Activator.CreateInstance(genericModel, e, metadata, position, version);

                    return(model as EventModel <TId>);
                };

                return(makeModel);
            });

            factory._services.AddSingleton <IEventStoreClient, EventStoreClient>();

            factory.AddEventRepository(sp =>
            {
                var store             = sp.GetRequiredService <IEventStoreClient>();
                var eventStoreOptions = sp.GetRequiredService <IOptionsMonitor <EventStoreConfig> >();

                return(new EventRepository <TId>(store, eventStoreOptions, eventDeserializers));
            });
        }
        public static void AddMediatR <TId>(this AggregateOPFactory <TId> factory)
        {
            factory.SetEventModelType(typeof(MediatedEventModel <,>));

            factory._services.AddMediatR(factory._assemblies);
        }