using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace ScreenConnect; public static class Activity { private static ActivityTracer[] tracers; private static ActivityContextProvider[] contextProviders; private static ActivityTracerFormatter formatter; static Activity() { tracers = CreatePluginTypes(); AppDomain.CurrentDomain.DomainUnload += delegate { tracers.DisposeQuietly(); }; contextProviders = CreatePluginTypes(); formatter = (from it in CreatePluginTypes() orderby it.GetType().GetAncestors((Type type) => type.BaseType).Count() descending select it).First(); } private static T[] CreatePluginTypes() where T : class { return (from _ in Extensions.GetPluginTypes(typeof(T)) where (object)_.GetConstructor(Type.EmptyTypes) != null where !_.IsAbstractX() select _).TrySelect(Activator.CreateInstance, shouldTraceException: false).Cast().WhereNotNull() .ToArray(); } public static void AddTracer(ActivityTracer tracer) { tracers = tracers.Append(tracer).ToArray(); } public static void Trace(string @namespace, string operation, IEnumerable> data) { TraceInternal(() => CreateDataFromNamespaceAndOperation(@namespace, operation).Concat(data)); } public static void Trace(IEnumerable> data) { TraceInternal(() => data); } public static void Trace(string @namespace, string operation, object dataObject) { TraceInternal(() => CreateDataFromNamespaceAndOperation(@namespace, operation).Concat(CreateDataFromDataObject(dataObject))); } private static IEnumerable> CreateDataFromNamespaceAndOperation(string @namespace, string operation) { yield return new KeyValuePair("namespace", @namespace); yield return new KeyValuePair("operation", operation); } public static IEnumerable> CreateDataFromDataObject(object dataObject) { return from it in dataObject.GetType().GetPropertiesX() select Extensions.CreateKeyValuePair(it.Name, it.GetValue(dataObject, Extensions.EmptyArray())); } private static void TraceInternal(Func>> dataCreator) { Lazy>> lazyData = Lazy.Create(dataCreator); Lazy> lazy = Lazy.Create(() => (from it in contextProviders.SelectMany((ActivityContextProvider it) => it.GetContextData()).Concat>(lazyData.Value) select Extensions.CreateKeyValuePair(it.Key, formatter.FormatObject(it.Value))).ToDictionary()); ActivityTracer[] array = tracers; for (int num = 0; num < array.Length; num++) { array[num].Trace(lazy.Value); } } }