public V4AggregateProjection() { _createMethods = new CreateMethodCollection(GetType(), typeof(T)); _applyMethods = new ApplyMethodCollection(GetType(), typeof(T)); _shouldDeleteMethods = new ShouldDeleteMethodCollection(GetType(), typeof(T)); ProjectionName = typeof(T).Name; }
public AggregateProjection() : base(typeof(T).NameInCode()) { _createMethods = new CreateMethodCollection(GetType(), typeof(T)); _applyMethods = new ApplyMethodCollection(GetType(), typeof(T)); _shouldDeleteMethods = new ShouldDeleteMethodCollection(GetType(), typeof(T)); ProjectionName = typeof(T).Name; Options.DeleteViewTypeOnTeardown <T>(); }
internal static ILiveAggregator <T> Build <T>(StoreOptions options) { var mapping = options.Storage.MappingFor(typeof(T)); var assembly = new GeneratedAssembly(new GenerationRules("Marten.Generated")); var applyMethods = new ApplyMethodCollection(typeof(T), typeof(T)); // TODO -- this doesn't do very much right now. var createMethods = new CreateMethodCollection(typeof(T), typeof(T)); assembly.Generation.Assemblies.Add(typeof(IMartenSession).Assembly); assembly.Generation.Assemblies.AddRange(applyMethods.ReferencedAssemblies()); assembly.Generation.Assemblies.AddRange(createMethods.ReferencedAssemblies()); var isAsync = applyMethods.IsAsync; assembly.Namespaces.Add("System.Linq"); var liveBaseType = isAsync ? typeof(AsyncLiveAggregatorBase <>) : typeof(SyncLiveAggregatorBase <>); liveBaseType = liveBaseType.MakeGenericType(typeof(T)); var liveType = assembly.AddType(typeof(T).NameInCode().Sanitize() + "LiveAggregation", liveBaseType); var overrideMethodName = isAsync ? "BuildAsync" : "Build"; var buildMethod = liveType.MethodFor(overrideMethodName); // TODO -- use constructor functions later // TODO -- use static Create() methods // TODO -- validate that there is some way to create the aggregate buildMethod.Frames.Code("if (!events.Any()) return null;"); buildMethod.Frames.Add(new CallCreateAggregateFrame(createMethods)); buildMethod.Frames.Add(new CallApplyAggregateFrame(applyMethods) { InsideForEach = true }); buildMethod.Frames.Return(typeof(T)); createMethods.BuildCreateMethod(liveType, mapping); applyMethods.BuildApplyMethod(liveType, mapping); var assemblyGenerator = new AssemblyGenerator(); assemblyGenerator.ReferenceAssembly(typeof(IMartenSession).Assembly); assemblyGenerator.Compile(assembly); return((ILiveAggregator <T>)Activator.CreateInstance(liveType.CompiledType)); }
public AggregateProjection() : base(typeof(T).NameInCode()) { _createMethods = new CreateMethodCollection(GetType(), typeof(T)); _applyMethods = new ApplyMethodCollection(GetType(), typeof(T)); _shouldDeleteMethods = new ShouldDeleteMethodCollection(GetType(), typeof(T)); ProjectionName = typeof(T).Name; Options.DeleteViewTypeOnTeardown <T>(); _allEventTypes = new Lazy <Type[]>(() => { return(_createMethods.Methods.Concat(_applyMethods.Methods).Concat(_shouldDeleteMethods.Methods) .Select(x => x.EventType).Concat(DeleteEvents).Distinct().ToArray()); }); }
protected GeneratedAggregateProjectionBase(AggregationScope scope) : base(typeof(T).NameInCode()) { _createMethods = new CreateMethodCollection(GetType(), typeof(T)); _applyMethods = new ApplyMethodCollection(GetType(), typeof(T)); _shouldDeleteMethods = new ShouldDeleteMethodCollection(GetType(), typeof(T)); Options.DeleteViewTypeOnTeardown <T>(); _allEventTypes = new Lazy <Type[]>(() => { return(_createMethods.Methods.Concat(_applyMethods.Methods).Concat(_shouldDeleteMethods.Methods) .Select(x => x.EventType).Concat(DeleteEvents).Concat(TransformedEvents).Distinct().ToArray()); }); _inlineAggregationHandlerType = GetType().ToSuffixedTypeName("InlineHandler"); _liveAggregationTypeName = GetType().ToSuffixedTypeName("LiveAggregation"); _versioning = new AggregateVersioning <T>(scope); }
public AggregateProjection() : base(typeof(T).NameInCode()) { _createMethods = new CreateMethodCollection(GetType(), typeof(T)); _applyMethods = new ApplyMethodCollection(GetType(), typeof(T)); _shouldDeleteMethods = new ShouldDeleteMethodCollection(GetType(), typeof(T)); ProjectionName = typeof(T).Name; Options.DeleteViewTypeOnTeardown <T>(); _allEventTypes = new Lazy <Type[]>(() => { return(_createMethods.Methods.Concat(_applyMethods.Methods).Concat(_shouldDeleteMethods.Methods) .Select(x => x.EventType).Concat(DeleteEvents).Concat(TransformedEvents).Distinct().ToArray()); }); _inlineAggregationHandlerType = GetType().NameInCode().Sanitize() + "InlineHandler"; _liveAggregationTypeName = GetType().NameInCode().Sanitize() + "LiveAggregation"; }
/// <summary> /// Get the associated apply method for the specified <see cref="Event"/> <paramref name="e"/> from the known <paramref name="applyMethods"/>. /// </summary> /// <param name="aggregate">The <see cref="Aggregate"/> instance on which the event is to be applied.</param> /// <param name="e">The <see cref="Event"/> to be applied.</param> /// <param name="applyMethods">The set of known apply methods for a given aggregate instance</param> private static Action <Aggregate, Event> GetApplyMethod(Aggregate aggregate, Event e, ApplyMethodCollection applyMethods) { Action <Aggregate, Event> applyMethod; Type eventType = e.GetType(); if (applyMethods.TryGetValue(eventType, out applyMethod)) { return(applyMethod); } if (!applyMethods.ApplyOptional) { throw new MappingException(Exceptions.AggregateApplyMethodNotFound.FormatWith(aggregate.GetType(), e.GetType())); } return(VoidApplyMethod); }
/// <summary> /// Get the associated apply method for the specified <see cref="Event"/> <paramref name="e"/> from the known <paramref name="applyMethods"/>. /// </summary> /// <param name="aggregate">The <see cref="Aggregate"/> instance on which the event is to be applied.</param> /// <param name="e">The <see cref="Event"/> to be applied.</param> /// <param name="applyMethods">The set of known apply methods for a given aggregate instance</param> private static Action<Aggregate, Event> GetApplyMethod(Aggregate aggregate, Event e, ApplyMethodCollection applyMethods) { Action<Aggregate, Event> applyMethod; Type eventType = e.GetType(); if (applyMethods.TryGetValue(eventType, out applyMethod)) return applyMethod; if (!applyMethods.ApplyOptional) throw new MappingException(Exceptions.AggregateApplyMethodNotFound.FormatWith(aggregate.GetType(), e.GetType())); return VoidApplyMethod; }