public static IVh <TValue> ToValueHolder(TValue value, bool ownsValue, bool nopDispose) { Type valueConcreteType, valueStoreConcreteType, cacheKey; if (__IsTValueValueType || value == null) { valueConcreteType = __TypeOfTValue; valueStoreConcreteType = __VhConcreteType; cacheKey = __VhFactoriesKey; } else { valueConcreteType = value.GetType(); valueStoreConcreteType = typeof(Vh <>).MakeGenericType(valueConcreteType); cacheKey = typeof(Func <, ,>).MakeGenericType(__TypeOfTValue, typeof(bool), valueStoreConcreteType); } var cachedDelegate = __VhFactories .GetOrAdd( spinLock: __VhFactoriesSpinLock, key: cacheKey, factory: (locKey) => ActivationUtilities.RequireConstructor <TValue, bool, bool, IVh <TValue> >(concreteType: valueStoreConcreteType, arg1ConcreteType: valueConcreteType)); return(cachedDelegate.Cast <Delegate, Func <TValue, bool, bool, IVh <TValue> > >()(arg1 : value, arg2 : ownsValue, arg3 : nopDispose)); }
static P_EnumTypeApi P_GetEnumTypeApi(Type type) => __EnumTypeApiCache .GetOrAdd( spinLock: __EnumTypeApiCacheSpinLock, key: type.EnsureNotNull(nameof(type)).EnsureEnum().Value, factory: (locKey) => ActivationUtilities.RequireConstructor <P_EnumTypeApi>(concreteType: typeof(P_EnumTypeApi <>).MakeGenericType(locKey))());
public static IArgsTuple <TArg1, TArg2, TArg3, TArg4, TArg5> Create <TArg1, TArg2, TArg3, TArg4, TArg5>(TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5) { var typesKey = new TypeTuple5( arg1?.GetType() ?? typeof(TArg1), arg2?.GetType() ?? typeof(TArg2), arg3?.GetType() ?? typeof(TArg3), arg4?.GetType() ?? typeof(TArg4), arg5?.GetType() ?? typeof(TArg5)); var createFunc = default(P_CreateFuncBase); if (!__CreateFuncsSpinLock.Invoke(() => __CreateFuncs5.TryGetValue(typesKey, out createFunc))) { createFunc = ActivationUtilities.RequireConstructor <P_CreateFuncBase>( typeof(P_CreateFunc <, , , ,>) .MakeGenericType( typesKey.Item1, typesKey.Item2, typesKey.Item3, typesKey.Item4, typesKey.Item5))(); createFunc = __CreateFuncs5 .GetOrAdd( spinLock: __CreateFuncsSpinLock, key: typesKey, factory: key => createFunc); } return(createFunc.Create(arg1, arg2, arg3, arg4, arg5)); }
protected virtual object GetService(Type serviceType) { serviceType.EnsureNotNull(nameof(serviceType)).EnsureClassOrInterface(); // var invoker = default(P_ResolveDependencyInvokerBase); if (!__ResolveDependencyInvokeRepoSpinLock.Invoke(() => __ResolveDependencyInvokers.TryGetValue(key: serviceType, value: out invoker))) { invoker = ActivationUtilities.RequireConstructor <P_ResolveDependencyInvokerBase>(typeof(P_ResolveDependencyInvoker <>).MakeGenericType(typeArguments: serviceType))(); __ResolveDependencyInvokeRepoSpinLock .Invoke( action: () => { try { __ResolveDependencyInvokers.Add(key: serviceType, value: invoker); } catch (ArgumentException) { invoker = __ResolveDependencyInvokers[serviceType]; } }); } object dependency; using (var ctx = new DependencyResolutionContext(scope: this, specs: new DependencyResolutionSpecs(dependencyType: serviceType, ensureResolution: false), ownsSpecs: true)) invoker.Invoke(scope: this, ctx: ctx, dependency: out dependency); return(dependency); }
static P_ConvertAsReadOnly() { try { __Ctor = new ValueHolderStruct <Func <T, bool, TResult> >(value: ActivationUtilities.RequireConstructor <T, bool, TResult>()); } catch (Exception exception) { __Ctor = new ValueHolderStruct <Func <T, bool, TResult> >(exception: exception); } }
public static IArgsTuple <TArg1> Create <TArg1>(TArg1 arg1) { var typesKey = new TypeTuple1(arg1?.GetType() ?? typeof(TArg1)); var createFunc = default(P_CreateFuncBase); if (!__CreateFuncsSpinLock.Invoke(() => __CreateFuncs1.TryGetValue(typesKey, out createFunc))) { createFunc = ActivationUtilities.RequireConstructor <P_CreateFuncBase>( typeof(P_CreateFunc <>) .MakeGenericType(typesKey.Item1))(); createFunc = __CreateFuncs1.GetOrAdd(spinLock: __CreateFuncsSpinLock, key: typesKey, factory: key => createFunc); } return(createFunc.Create(arg1)); }
public static IQueryable Invoke(Type elementType, EfCoreDbContext context) { elementType .Arg(nameof(elementType)) .EnsureNotNull() .EnsureClass(); var invokerImpl = ImmutableInterlocked .GetOrAdd( location: ref __InvokerByElementType, key: elementType, valueFactory: locKey => ActivationUtilities.RequireConstructor <P_CreateQueryInvoke>(concreteType: typeof(P_Invoke <>).MakeGenericType(elementType))()); return(invokerImpl.CreateQuery(context)); }
// TODO: Put strings into the resources. // static Func <EfCoreDbContextCtorArgs, TEfDbContext> P_RequireEfDbContextCtor() { var ctor = itrlck.Get(ref __EfDbContextCtor); if (ctor is null) { try { ctor = ActivationUtilities.RequireConstructor <EfCoreDbContextCtorArgs, TEfDbContext>(); } catch (Exception exception) { throw new EonException(message: $"An exception occurred while requiring the special constructor of the EF context class '{typeof(TEfDbContext)}'.", innerException: exception); } itrlck.UpdateIfNull(location: ref __EfDbContextCtor, value: ctor); } return(ctor); }
/// <summary> /// Creates a new context using context class <typeparamref name="TContext"/> special constructor. /// <para>A special constructor must meet the following signature: (<see cref="XFullCorrelationId"/> fullCorrelationId, <see cref="ArgumentPlaceholder{XCorrelationId}"/> correlationId, <see cref="object"/> localTag, <see cref="IContext"/> outerCtx).</para> /// <para>Visibility level of a special constructor doesn't matter.</para> /// </summary> /// <typeparam name="TContext">Type of context to be created.</typeparam> /// <param name="fullCorrelationId"> /// Full correlation-id. /// </param> /// <param name="correlationId"> /// Correlation-id of context to be created. /// </param> /// <param name="localTag"> /// Special user defined tag. /// </param> /// <param name="ct"> /// Cancellation token. /// </param> /// <param name="disposeRegistry"> /// Dispose registry. /// </param> /// <param name="progress"> /// Progress reporter. /// </param> /// <param name="displayName"> /// Display name. /// </param> /// <param name="outerCtx">Outer context of context to be created.</param> public static TContext Create <TContext>( XFullCorrelationId fullCorrelationId = default, ArgumentPlaceholder <XCorrelationId> correlationId = default, object localTag = default, ArgumentPlaceholder <CancellationToken> ct = default, ArgumentPlaceholder <IVh <IDisposeRegistry> > disposeRegistry = default, ArgumentPlaceholder <IVh <IAsyncProgress <IFormattable> > > progress = default, ArgumentPlaceholder <IFormattable> displayName = default, IContext outerCtx = default) where TContext : class, IContext { // var ctx = ActivationUtilities .RequireConstructor <XFullCorrelationId, ArgumentPlaceholder <XCorrelationId>, object, IContext, TContext>() (arg1 : fullCorrelationId, arg2 : correlationId, arg3 : localTag, arg4 : outerCtx); // if (ct.HasExplicitValue) { CtProp.SetLocalValue(ctx: ctx, value: ct.ExplicitValue); } if (disposeRegistry.HasExplicitValue) { DisposeRegistryProp.SetLocalValue(ctx: ctx, value: disposeRegistry.ExplicitValue); } if (progress.HasExplicitValue) { ProgressProp.SetLocalValue(ctx: ctx, value: progress.ExplicitValue); } if (displayName.HasExplicitValue) { DisplayNameProp.SetLocalValue(ctx: ctx, value: displayName.ExplicitValue); } // return(ctx); }
// TODO: Put exception messages into the resources. // public ICsvDataTable Parse(TextReader inputTextReader) { if (inputTextReader == null) { throw new ArgumentNullException("inputTextReader"); } P_Table table = null; var rows = new LinkedList <Row>(); try { string textLine; string columnName; var rowCtor = default(Func <ICsvDataTable, IEnumerable <string>, Row>); var textLineNumber = 0; var textLineValues = new List <string>(48); var columnNamesOrder = default(Dictionary <string, int>); for (;;) { if (textLineNumber - 1 >= MaxRowCount) { throw new DigitalFlareApplicationException(string.Format("Источник данных содержит слишком много строк. Макс. допустимое количество строк '{0}'.", MaxRowCount.TextViewInvariant("d"))); } textLine = inputTextReader.ReadLine(); if (textLine == null) { break; } textLineNumber++; if (string.IsNullOrWhiteSpace(textLine)) { throw new DigitalFlareApplicationException(string.Format("Несоответствие данных источника формату CSV. Данные, считанные из '{0}' строки источника представляют либо пустую строку, либо строку, содержащую только пробельные символы.", textLineNumber.TextViewInvariant("d"))); } if (textLineNumber == 1) { // Table columns line. // textLineValues.Clear(); CsvUtilities.SplitLine(textLine, textLineNumber, textLineValues); if (textLineValues.Count < 1) { throw new DigitalFlareApplicationException("Несоответствие данных источника формату CSV. Невозможно определить структуру CSV-таблицы."); } columnNamesOrder = new Dictionary <string, int>(ColumnNameEqualityComparer); for (var i = 0; i < textLineValues.Count; i++) { columnName = textLineValues[i]; if (string.IsNullOrEmpty(columnName)) { throw new DigitalFlareApplicationException(string.Format("Несоответствие данных источника формату CSV. Для колонки в '{0}' позиции не задано имя.", (i + 1).TextViewInvariant("d"))); } if (columnName.Length > MaxColumnNameLength) { throw new DigitalFlareApplicationException(string.Format("Для колонки в '{0}' позиции задано слишком длинное имя. Макс. длина имени составляет '{1}' символов.", (i + 1).TextViewInvariant("d"), MaxColumnNameLength.TextViewInvariant("d"))); } if (columnNamesOrder.ContainsKey(columnName)) { throw new DigitalFlareApplicationException(string.Format("Несоответствие данных источника формату CSV. Для колонки в '{0}' позиции задано неуникальное имя '{1}'.", (i + 1).TextViewInvariant("d"), columnName.TextView())); } columnNamesOrder.Add(columnName, i); } table = new P_Table(P_GenerateRowType(columnNamesOrder, ColumnNameComparer), ColumnNameEqualityComparer); table.Internal_SetColumns(columnNamesOrder.OrderBy(x => x.Value).Select(i => new P_Column(table, i.Key))); } else { // Table row line. // textLineValues.Clear(); CsvUtilities.SplitLine(textLine, textLineNumber, textLineValues); if (textLineValues.Count != columnNamesOrder.Count) { throw new DigitalFlareApplicationException(string.Format("Несоответствие данных источника формату CSV. Строка данных (номер строки '{0}') не соответствует структуре таблицы по количеству колонок в таблице.", textLineNumber.TextViewInvariant("d"))); } if (rowCtor == null) { rowCtor = ActivationUtilities.RequireConstructor <ICsvDataTable, IEnumerable <string>, Row>(concreteType: table.RowType); } rows.AddLast(rowCtor(table, textLineValues)); } } if (table == null) { throw new DigitalFlareApplicationException("Источник данных не содержит какого-либо содержимого, на основе которого можно было бы создать CSV-таблицу."); } table.Internal_SetRows(rows); return(table); } catch (Exception firstException) { if (firstException.IsCritical()) { throw; } DisposableUtilities.Dispose(firstException, table); throw new DigitalFlareApplicationException("Во время создания CSV-таблицы из указанного источника данных возникла ошибка.", firstException); } }
static CtorFactoryDependencyHandler() { __DependencyInstanceCtor = new DisposableLazy <Func <TDependencyInstance> >(() => ActivationUtilities.RequireConstructor <TDependencyInstance>()); }
// TODO: Put strings into the resources. // public static IFactoryDependencyHandler GetDefaultDependencyHandler(INewInstanceDependencyTarget target) { target.EnsureNotNull(nameof(target)); // var dependencyInstanceType = target.TargetType?.Resolve(); if (dependencyInstanceType is null) { throw new ArgumentException( message: $"Указанным аргументом не определен целевой тип зависимости (свойство '{nameof(target.TargetType)}').", paramName: nameof(target)); } else if (dependencyInstanceType.IsValueType()) { throw new ArgumentException( message: $"Целевой тип, определенный указанным аргументом, не является ссылочным типом.{Environment.NewLine}\tЦелевой тип:{Environment.NewLine}{dependencyInstanceType.FmtStr().G().IndentLines2()}", paramName: nameof(target)); } // const int maxCtorSignatureArgsCount = 5; var dependencyInstanceCtorArgsTypes = target .ConstructorSignature .EmptyIfNull() .Take(maxCtorSignatureArgsCount + 1) .Select(locTypeReference => locTypeReference?.Resolve()) .ToArray(); int nullElementIndex; if (dependencyInstanceCtorArgsTypes.Length > maxCtorSignatureArgsCount) { throw new ArgumentException( message: $"Количество аргументов сигнатуры конструктора целевого типа зависимости (свойство '{nameof(INewInstanceDependencyTarget)}.{nameof(target.ConstructorSignature)}') превышает максимально допустимое '{maxCtorSignatureArgsCount:d}'.", paramName: nameof(target)); } else if ((nullElementIndex = dependencyInstanceCtorArgsTypes.IndexOf(i => i is null)) > -1) { throw new ArgumentException( message: $"Набор аргументов сигнатуры конструктора целевого типа зависимости (свойство '{nameof(INewInstanceDependencyTarget)}.{nameof(target.ConstructorSignature)}') недопустим. {FormatXResource(typeof(Array), "CanNotContainNull/NullAt", nullElementIndex.ToString("d"))}", paramName: nameof(target)); } // TypeTubple6 repositoryKey; switch (dependencyInstanceCtorArgsTypes.Length) { case 0: repositoryKey = new TypeTubple6(__EmptyType, __EmptyType, __EmptyType, __EmptyType, __EmptyType, dependencyInstanceType); break; case 1: repositoryKey = new TypeTubple6(__EmptyType, __EmptyType, __EmptyType, __EmptyType, dependencyInstanceCtorArgsTypes[0], dependencyInstanceType); break; case 2: repositoryKey = new TypeTubple6(__EmptyType, __EmptyType, __EmptyType, dependencyInstanceCtorArgsTypes[0], dependencyInstanceCtorArgsTypes[1], dependencyInstanceType); break; case 3: repositoryKey = new TypeTubple6(__EmptyType, __EmptyType, dependencyInstanceCtorArgsTypes[0], dependencyInstanceCtorArgsTypes[1], dependencyInstanceCtorArgsTypes[2], dependencyInstanceType); break; case 4: repositoryKey = new TypeTubple6(__EmptyType, dependencyInstanceCtorArgsTypes[0], dependencyInstanceCtorArgsTypes[1], dependencyInstanceCtorArgsTypes[2], dependencyInstanceCtorArgsTypes[3], dependencyInstanceType); break; default: repositoryKey = new TypeTubple6(dependencyInstanceCtorArgsTypes[0], dependencyInstanceCtorArgsTypes[1], dependencyInstanceCtorArgsTypes[2], dependencyInstanceCtorArgsTypes[3], dependencyInstanceCtorArgsTypes[4], dependencyInstanceType); break; } return (__DefaultHandlers .GetOrAdd( spinLock: __DefaultHandlersSpinLock, key: repositoryKey, factory: factory, unclaimedValue: (locKey, locValue) => locValue?.Dispose()) .Value); // DisposableLazy <IFactoryDependencyHandler> factory(TypeTubple6 locKey) => new DisposableLazy <IFactoryDependencyHandler>( factory: () => { // Проверить существование конструктора экземпляра зависимости. // dependencyInstanceType.EnsureInstantiation(argsTypes: dependencyInstanceCtorArgsTypes); // switch (dependencyInstanceCtorArgsTypes.Length) { case 0: return (ActivationUtilities .RequireConstructor <IFactoryDependencyHandler>( concreteType: typeof(CtorFactoryDependencyHandler <>).MakeGenericType(locKey.Item6)) ()); case 1: return (ActivationUtilities .RequireConstructor <IFactoryDependencyHandler>( concreteType: typeof(CtorFactoryDependencyHandler <,>).MakeGenericType(locKey.Item5, locKey.Item6)) ()); case 2: return (ActivationUtilities .RequireConstructor <IFactoryDependencyHandler>( concreteType: typeof(CtorFactoryDependencyHandler <, ,>).MakeGenericType(locKey.Item4, locKey.Item5, locKey.Item6)) ()); case 3: return (ActivationUtilities .RequireConstructor <IFactoryDependencyHandler>( concreteType: typeof(CtorFactoryDependencyHandler <, , ,>).MakeGenericType(locKey.Item3, locKey.Item4, locKey.Item5, locKey.Item6)) ()); case 4: return (ActivationUtilities .RequireConstructor <IFactoryDependencyHandler>( concreteType: typeof(CtorFactoryDependencyHandler <, , , ,>).MakeGenericType(locKey.Item2, locKey.Item3, locKey.Item4, locKey.Item5, locKey.Item6)) ()); default: return (ActivationUtilities .RequireConstructor <IFactoryDependencyHandler>( concreteType: typeof(CtorFactoryDependencyHandler <, , , , ,>).MakeGenericType(locKey.Item1, locKey.Item2, locKey.Item3, locKey.Item4, locKey.Item5, locKey.Item6)) ()); } }, ownsValue: true); }
static CtorFactoryDependencyHandler() { __DependencyInstanceCtor = new DisposableLazy <Func <TArg1, TArg2, TArg3, TDependencyInstance> >(() => ActivationUtilities.RequireConstructor <TArg1, TArg2, TArg3, TDependencyInstance>(arg1: default)); }
P_StorageOpCtxBase P_CreateStrictedCtx(PersistenceEntityReferenceKeyTypeDescriptor key) => ActivationUtilities .RequireConstructor <P_StorageOpCtx, PersistenceEntityReferenceKeyTypeDescriptor, P_StorageOpCtxBase>( concreteType: typeof(P_StrictedStorageOpCtx <,>).MakeGenericType(typeArguments: new Type[] { typeof(TEfDbContext), key.EntityType, key.ReferenceKeyType })) (arg1 : this, arg2 : key);