Пример #1
0
        /// <summary>
        /// Adds Kind
        /// </summary>
        /// <param name="viewModel">Injected <see cref="AddKind"/></param>
        /// <returns>Instance of <see cref="Task{ViewKind}"/></returns>
        public async Task <ViewKind> AddKind(AddKind @viewModel)
        {
            await CheckName(@viewModel);

            Kind @Kind = new()
            {
                Name     = @viewModel.Name,
                ImageUri = @viewModel.ImageUri
            };

            try
            {
                await Context.Kind.AddAsync(@Kind);

                await Context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                await CheckName(@viewModel);
            }

            // Log
            string @logData = @Kind.GetType().Name
                              + " with Id "
                              + @Kind.Id
                              + " was added at "
                              + DateTime.Now.ToShortTimeString();

            Logger.WriteInsertItemLog(@logData);

            return(Mapper.Map <ViewKind>(@Kind));
        }
Пример #2
0
        /// <summary>
        /// Checks Name
        /// </summary>
        /// <param name="viewModel">Injected <see cref="AddKind"/></param>
        /// <returns>Instance of <see cref="Task{Kind}"/></returns>
        public async Task <Kind> CheckName(AddKind @viewModel)
        {
            Kind @Kind = await Context.Kind
                         .TagWith("CheckName")
                         .AsNoTracking()
                         .FirstOrDefaultAsync(x => x.Name == @viewModel.Name);

            if (@Kind != null)
            {
                // Log
                string @logData = @Kind.GetType().Name
                                  + " with Name "
                                  + @Kind.Name
                                  + " was already found at "
                                  + DateTime.Now.ToShortTimeString();

                Logger.WriteGetItemFoundLog(@logData);

                throw new Exception(@Kind.GetType().Name
                                    + " with Name "
                                    + @viewModel.Name
                                    + " already exists");
            }

            return(@Kind);
        }
        private static IServiceCollection AddInterceptableCore(this IServiceCollection services, Type serviceType, Type implementationType, ServiceLifetime lifetime, AddKind kind)
        {
            Guard.ArgumentNotNull(services, nameof(services));
            Guard.ArgumentNotNull(serviceType, nameof(serviceType));
            Guard.ArgumentNotNull(implementationType, nameof(implementationType));

            if (serviceType.IsGenericTypeDefinition)
            {
                if (!services.Any(it => it.ServiceType == typeof(ICodeGeneratorFactory)))
                {
                    throw new InvalidOperationException("IServiceCollection's AddInterception method must be called before register open generic service type.");
                }
                if (_codeGeneratorFactory == null)
                {
                    var provider = services.BuildServiceProvider();
                    _codeGeneratorFactory = provider.GetRequiredService <ICodeGeneratorFactory>();
                    _interceptorResolver  = provider.GetRequiredService <IInterceptorResolver>();
                }
                if (serviceType != implementationType)
                {
                    services.AddTransient(implementationType, implementationType);
                }
            }
            switch (kind)
            {
            case AddKind.AlwaysAdd:
            {
                if (serviceType.IsGenericTypeDefinition)
                {
                    services.Add(new GenericInterceptableServiceDescriptor(_codeGeneratorFactory, _interceptorResolver, serviceType, implementationType, lifetime));
                }
                else
                {
                    services.Add(new InterceptableServiceDescriptor(serviceType, implementationType, lifetime));
                }
                break;
            }

            case AddKind.TryAdd:
            {
                if (serviceType.IsGenericTypeDefinition)
                {
                    services.TryAdd(new GenericInterceptableServiceDescriptor(_codeGeneratorFactory, _interceptorResolver, serviceType, implementationType, lifetime));
                }
                else
                {
                    services.TryAdd(new InterceptableServiceDescriptor(serviceType, implementationType, lifetime));
                }
                break;
            }

            case AddKind.TryAddEnumerable:
            {
                if (!services.OfType <IInterceptableServiceDescriptor>().Any(it => it.TargetType == implementationType))
                {
                    if (serviceType.IsGenericTypeDefinition)
                    {
                        services.TryAddEnumerable(new GenericInterceptableServiceDescriptor(_codeGeneratorFactory, _interceptorResolver, serviceType, implementationType, lifetime));
                    }
                    else
                    {
                        services.TryAddEnumerable(new InterceptableServiceDescriptor(serviceType, implementationType, lifetime));
                    }
                }
                break;
            }
            }
            return(services);
        }