Пример #1
0
            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));
            }
Пример #2
0
 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))());
Пример #3
0
        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));
        }
Пример #4
0
        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);
        }
Пример #5
0
 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);
     }
 }
Пример #6
0
        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));
        }
Пример #7
0
            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));
            }
Пример #8
0
        // 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);
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
        // 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>());
 }
Пример #12
0
        // 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);
        }
Пример #13
0
 static CtorFactoryDependencyHandler()
 {
     __DependencyInstanceCtor =
         new DisposableLazy <Func <TArg1, TArg2, TArg3, TDependencyInstance> >(() => ActivationUtilities.RequireConstructor <TArg1, TArg2, TArg3, TDependencyInstance>(arg1: default));
 }
Пример #14
0
 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);