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); }