Exemple #1
0
 public static void AddIfNot <TService, TImplement>(this IServiceCollection services, ServiceLifetime lifetime)
     where TImplement : class, TService
 {
     Throw.IfArgumentNull(services, nameof(services));
     if (!services.IsRegistered(typeof(TService)))
     {
         services.Add(ServiceDescriptor.Describe(typeof(TService), typeof(TImplement), lifetime));
     }
 }
        /// <summary>
        /// Adds and configures a IMultiTenantStore to the application using a factory method.
        /// </summary>
        /// <param name="lifetime">The service lifetime.</param>
        /// <param name="factory">A delegate that will create and configure the store.</param>
        /// <returns>The same MultiTenantBuilder passed into the method.</returns>
        public FinbuckleMultiTenantBuilder <TTenantInfo> WithStore <TStore>(ServiceLifetime lifetime, Func <IServiceProvider, TStore> factory)
            where TStore : IMultiTenantStore <TTenantInfo>
        {
            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            // Note: can't use TryAddEnumerable here because ServiceDescriptor.Describe with a factory can't set implementation type.
            Services.Add(ServiceDescriptor.Describe(typeof(IMultiTenantStore <TTenantInfo>), sp => factory(sp), lifetime));

            return(this);
        }
        /// <summary>
        /// Adds and configures a IMultiTenantStrategy to the application using a factory method.
        /// </summary>
        /// <param name="lifetime">The service lifetime.</param>
        /// <param name="factory">A delegate that will create and configure the strategy.</param>
        /// <returns>The same MultiTenantBuilder passed into the method.</returns>
        public FinbuckleMultiTenantBuilder <TTenantInfo> WithStrategy <TStrategy>(ServiceLifetime lifetime, Func <IServiceProvider, TStrategy> factory)
            where TStrategy : IMultiTenantStrategy
        {
            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            // Potential for multiple entries per service is intended.
            Services.Add(ServiceDescriptor.Describe(typeof(IMultiTenantStrategy), sp => factory(sp), lifetime));

            return(this);
        }
Exemple #4
0
        /// <summary>
        /// Adds and configures a IMultiTenantStrategy to the application using a factory method.
        /// </summary>
        /// <param name="lifetime">The service lifetime.</param>
        /// <param name="factory">A delegate that will create and configure the strategy.</param>
        /// <returns>The same MultiTenantBuilder passed into the method.</returns>
        public FinbuckeMultiTenantBuilder WithStrategy <TStrategy>(ServiceLifetime lifetime, Func <IServiceProvider, TStrategy> factory)
            where TStrategy : IMultiTenantStrategy
        {
            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            services.TryAdd(ServiceDescriptor.Describe(typeof(IMultiTenantStrategy),
                                                       sp => new MultiTenantStrategyWrapper <TStrategy>(factory(sp), sp.GetService <ILogger <TStrategy> >()), lifetime));

            return(this);
        }
Exemple #5
0
        public static IServiceCollection AddTriggeredDbContext <TContext>(this IServiceCollection serviceCollection, Action <DbContextOptionsBuilder>?optionsAction = null, ServiceLifetime contextLifetime = ServiceLifetime.Scoped, ServiceLifetime optionsLifetime = ServiceLifetime.Scoped)
            where TContext : DbContext
        {
            serviceCollection.TryAdd(ServiceDescriptor.Describe(
                                         serviceType: typeof(TContext),
                                         implementationFactory: serviceProvider => CreateContextFactory(serviceProvider, typeof(TContext)),
                                         lifetime: contextLifetime));

            serviceCollection.AddDbContext <TContext>(options => {
                optionsAction?.Invoke(options);
                options.UseTriggers();
            }, contextLifetime, optionsLifetime);

            return(serviceCollection);
        }
        private static void AddType(IServiceCollection services, Type type)
        {
            var autoBindAttribute = GetAutoBindAttributeOrNull(type);
            var lifeTime          = GetLifeTimeOrNull(type, autoBindAttribute);

            if (lifeTime == null)
            {
                return;
            }

            foreach (var serviceType in GetDefaultExposedServices(services, type))
            {
                var serviceDescriptor = ServiceDescriptor.Describe(serviceType, type, lifeTime.Value);
                services.Add(serviceDescriptor);
            }
        }
Exemple #7
0
        internal bool TryCreateFacadeImplementation(ServiceDescriptor descriptor, Func <IServiceProvider, object> implementationFactory, out ServiceDescriptor proxyServiceDescriptor)
        {
            ServiceDescriptor CreateServiceDescriptor(ServiceDescriptor x, Type type)
            {
                var setInstance = type.CreateInstanceSetter();
                var factory     = type.CreateFacadeInstanceCreator();

                return(ServiceDescriptor.Describe(x.ServiceType, i =>
                {
                    var proxy = factory(i);
                    setInstance(proxy, implementationFactory(i));
                    return proxy;
                }, x.Lifetime));
            }

            return(TryCreateImplementation(ProxyTypes.Facade, descriptor.ServiceType, descriptor, CreateServiceDescriptor, out proxyServiceDescriptor));
        }
Exemple #8
0
        public static bool TryCreateProxyDescriptor(Dictionary <Type, Type> defaultInterfaceImplementDict, Dictionary <Type, Type> proxyDict, ServiceDescriptor origin, out ServiceDescriptor proxy)
        {
            proxy = origin;
            var serviceType = proxy.ServiceType.IsGenericType ? proxy.ServiceType.GetGenericTypeDefinition() : proxy.ServiceType;

            if (proxy.ImplementationType == typeof(DefaultImplementAttribute) &&
                defaultInterfaceImplementDict.TryGetValue(serviceType, out var implementType))
            {
                proxy = ServiceDescriptor.Describe(proxy.ServiceType, proxy.ServiceType.IsGenericType ? implementType.MakeGenericType(proxy.ServiceType.GetGenericArguments()) : implementType, proxy.Lifetime);
            }
            if (proxyDict.ContainsKey(serviceType))
            {
                proxy = ToImplementationServiceDescriptor(proxy, proxy.ServiceType.IsGenericType ? proxyDict[serviceType].MakeGenericType(proxy.ServiceType.GetGenericArguments()) : proxyDict[serviceType]);
            }

            return(proxy != origin);
        }
        public static IServiceCollection AddXrmFramework(this IServiceCollection serviceCollection, Action <XrmFrameworkOptionBuilder> optionsBuilderAction = null)
        {
            var optionsBuilder = new XrmFrameworkOptionBuilder();

            optionsBuilderAction?.Invoke(optionsBuilder);

            serviceCollection.TryAdd(new ServiceDescriptor(typeof(IOrganizationService), sp =>
#if NETCOREAPP
                                                           new Microsoft.PowerPlatform.Dataverse.Client.ServiceClient(optionsBuilder.ConnectionString)
#else
                                                           new Xrm.Tooling.Connector.CrmServiceClient(optionsBuilder.ConnectionString)
#endif

                                                           , ServiceLifetime.Singleton));
            serviceCollection.TryAdd(new ServiceDescriptor(typeof(IServiceContext), sp =>
            {
                var orgService = sp.GetService <IOrganizationService>();
                return(new ServiceContextBase(orgService));
            }, ServiceLifetime.Singleton));

            var assembly = typeof(IService).Assembly;

            var serviceType = typeof(IService);

            var serviceTypes = assembly.GetModules().SelectMany(m => m.GetTypes().Where(t => serviceType.IsAssignableFrom(t) && t.IsInterface)).ToList();
            var serviceImplementationTypes = assembly.GetModules().SelectMany(m => m.GetTypes().Where(type => !type.IsAbstract && type.IsClass && serviceType.IsAssignableFrom(type))).ToList();

            foreach (var type in serviceTypes)
            {
                var serviceImplementationType = serviceImplementationTypes.FirstOrDefault(t => type.IsAssignableFrom(t));

                if (serviceImplementationType != null)
                {
                    var descriptor = ServiceDescriptor.Describe(type,
                                                                (sp) =>
                                                                DynamicProxyLoggingDecorator.Decorate(type,
                                                                                                      ActivatorUtilities.GetServiceOrCreateInstance(sp, serviceImplementationType)),
                                                                ServiceLifetime.Scoped);

                    serviceCollection.Add(descriptor);
                }
            }

            return(serviceCollection);
        }
        public static IServiceCollection AddSciterArchivesFromAssembly(this IServiceCollection services,
                                                                       Assembly assembly)
        {
            var attributes = assembly?.GetCustomAttributes <SciterCoreArchiveAttribute>()?.ToList();

            if (attributes?.Any() == true)
            {
                foreach (var attribute in attributes)
                {
                    services.Add(ServiceDescriptor.Describe(
                                     serviceType: typeof(LazySciterArchive),
                                     implementationFactory: provider => new LazySciterArchive(attribute.Uri, assembly,
                                                                                              attribute.ResourceName, attribute.InitScripts), lifetime: ServiceLifetime.Singleton));
                }
            }

            return(services);
        }
Exemple #11
0
        private void Setup(ServiceLifetime lifetime)
        {
            IServiceCollection services = new ServiceCollection();

            for (int i = 0; i < 10; i++)
            {
                services.Add(ServiceDescriptor.Describe(typeof(A), typeof(A), lifetime));
            }

            services.Add(ServiceDescriptor.Describe(typeof(B), typeof(B), lifetime));
            services.Add(ServiceDescriptor.Describe(typeof(C), typeof(C), lifetime));

            _serviceProvider = services.BuildServiceProvider(new ServiceProviderOptions()
            {
#if INTERNAL_DI
                Mode = ServiceProviderMode
#endif
            }).CreateScope().ServiceProvider;
        }
        public static IServiceCollection DiscoverService <TService>(this IServiceCollection services, ServiceLifetime serviceLifetime = ServiceLifetime.Transient) where TService : class
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            services.Add(ServiceDescriptor.Describe(typeof(TService), ResolveService, serviceLifetime));

            return(services);

            object ResolveService(IServiceProvider serviceProvider)
            {
                var discoveryService = serviceProvider.GetRequiredService <IDiscoveryService>();

                var service = discoveryService.Discover <TService>();

                return(service);
            }
        }
Exemple #13
0
        public static IServiceCollection DiscoverServiceUsingAdapter <TService>(this IServiceCollection services, ServiceLifetime serviceLifetime = ServiceLifetime.Transient)
            where TService : class
        {
            services.Add(ServiceDescriptor.Describe(typeof(TService), ResolveService, serviceLifetime));

            return(services);

            object ResolveService(IServiceProvider serviceProvider)
            {
                var discoveryService = serviceProvider.GetRequiredService <IDiscoveryService>();

                var bindingFactory = serviceProvider.GetRequiredService <IBindingFactory>();

                var binding = bindingFactory.Create(typeof(TService));

                var service = discoveryService.Discover <TService>(binding);

                return(service);
            }
        }
        private static IServiceCollection AddHostEventHandler <THost>(this IServiceCollection services)
            where THost : SciterHost
        {
            var hostEventHandlerAttribute =
                typeof(THost).GetCustomAttributes <SciterHostEventHandlerAttribute>().FirstOrDefault();

            if (hostEventHandlerAttribute == null)
            {
                return(services);
            }

            if (HostEventHandlerRegistry.Instance.TryAdd(typeof(THost),
                                                         hostEventHandlerAttribute.EventHandlerType))
            {
                services.Add(ServiceDescriptor.Describe(hostEventHandlerAttribute.EventHandlerType,
                                                        hostEventHandlerAttribute.EventHandlerType, ServiceLifetime.Transient));
            }

            return(services);
        }
        public static ILetsEncryptBuilder AddHttpChallengeResponse(this ILetsEncryptBuilder builder)
        {
            builder.Services.AddLogging();

            builder.Services.AddSingleton <HttpChallenge>();

            builder.Services
            .AddOptions <KestrelServerOptions>()
            .Configure <KestrelCertificateSelector>((options, certificateSelector) =>
            {
                options.ConfigureHttpsDefaults(o => o.ServerCertificateSelector = certificateSelector.Select);
            });

            builder.Services
            .AddSingleton <DevelopmentCertificate>()
            .AddSingleton(sp =>
            {
                var validator = sp.GetRequiredService <ICertificateValidator>();
                return(new KestrelCertificateSelector(builder.Name, validator));
            });

            builder.Services.Add(ServiceDescriptor.Describe(
                                     typeof(IHostedService),
                                     sp => new StartupCertificateLoader(builder.Name, sp),
                                     ServiceLifetime.Singleton));

            builder.Services
            .AddSingleton <IStartupFilter, HttpChallengeStartupFilter>();

            builder.Services
            .AddOptions <HttpChallengeResponseOptions>(string.Empty)       // TODO: figure out how to tie it to builder.Name
            .Configure <IServiceProvider>((options, sp) =>
            {
                options.ChallengeStore = sp.GetServices <IAcmeChallengeStore>().First(x => x is InMemoryChallengeStore);
            });


            builder.Services.AddSchedulerJob <AcmeRenewalJob, AcmeRenewalJobOptions>(sectionName: "LetsEncrypt");

            return(builder);
        }
Exemple #16
0
        public static IServiceCollection AddOrReplace <TContract, TImplementation>(this IServiceCollection services, ServiceLifetime lifetime, Func <IServiceProvider, TContract> factory)
            where TContract : class
            where TImplementation : TContract
        {
            var found = services.FirstOrDefault(p => p.ServiceType == typeof(TContract) && (p.ImplementationType ?? p.ImplementationFactory?.Method?.ReturnType) == typeof(TImplementation) && p.Lifetime == lifetime);

            var service = ServiceDescriptor.Describe(typeof(TContract), factory, lifetime);

            if (found != null)
            {
                var index = services.IndexOf(found);
                services.RemoveAt(index);
                services.Insert(index, service);
            }
            else
            {
                services.Add(service);
            }

            return(services);
        }
        public static IServiceCollection AddTriggeredDbContextPool <TContext>(this IServiceCollection serviceCollection, Action <DbContextOptionsBuilder>?optionsAction = null, int poolSize = 128)
            where TContext : DbContext
        {
            serviceCollection.AddDbContextPool <TContext>(options => {
                optionsAction?.Invoke(options);
                options.UseTriggers();
            }, poolSize);

            var serviceDescriptor = serviceCollection.FirstOrDefault(x => x.ServiceType == typeof(TContext));

            if (serviceDescriptor?.ImplementationFactory != null)
            {
                serviceCollection.Replace(ServiceDescriptor.Describe(
                                              serviceType: typeof(TContext),
                                              implementationFactory: serviceProvider => SetApplicationTriggerServiceProviderAccessor(serviceDescriptor.ImplementationFactory(serviceProvider), serviceProvider),
                                              lifetime: ServiceLifetime.Scoped
                                              ));
            }

            return(serviceCollection);
        }
Exemple #18
0
        public static IServiceCollection AddTriggeredPooledDbContextFactory <TContext>(this IServiceCollection serviceCollection, Action <DbContextOptionsBuilder>?optionsAction = null, int poolSize = 128)
            where TContext : DbContext
        {
            serviceCollection.AddPooledDbContextFactory <TContext>(options => {
                optionsAction?.Invoke(options);
                options.UseTriggers();
            }, poolSize);

            var serviceDescriptor = serviceCollection.FirstOrDefault(x => x.ServiceType == typeof(IDbContextFactory <TContext>));

            if (serviceDescriptor?.ImplementationType != null)
            {
                var triggeredFactoryType = typeof(TriggeredDbContextFactory <,>).MakeGenericType(typeof(TContext), serviceDescriptor.ImplementationType);

                serviceCollection.TryAdd(ServiceDescriptor.Describe(
                                             serviceType: serviceDescriptor.ImplementationType,
                                             implementationType: serviceDescriptor.ImplementationType,
                                             lifetime: serviceDescriptor.Lifetime
                                             ));

                serviceCollection.Replace(ServiceDescriptor.Describe(
                                              serviceType: typeof(IDbContextFactory <TContext>),
                                              implementationFactory: serviceProvider => ActivatorUtilities.CreateInstance(serviceProvider, triggeredFactoryType, serviceProvider.GetRequiredService(serviceDescriptor.ImplementationType), serviceProvider),
                                              lifetime: ServiceLifetime.Scoped
                                              ));
            }

            if (serviceDescriptor?.ImplementationFactory != null)
            {
                var triggeredFactoryType = typeof(TriggeredDbContextFactory <>).MakeGenericType(typeof(TContext));

                serviceCollection.Replace(ServiceDescriptor.Describe(
                                              serviceType: typeof(IDbContextFactory <TContext>),
                                              implementationFactory: serviceProvider => ActivatorUtilities.CreateInstance(serviceProvider, triggeredFactoryType, serviceDescriptor.ImplementationFactory),
                                              lifetime: ServiceLifetime.Scoped
                                              ));
            }
            return(serviceCollection);
        }
        private static IModelPredictionEngineBuilder <TInput, TPrediction> AddModelLoader <TInput, TPrediction, TLoader>(
            this IModelPredictionEngineBuilder <TInput, TPrediction> builder,
            Action <ModelLoderFileOptions>?configure = null,
            ServiceLifetime serviceLifetime          = ServiceLifetime.Transient)
            where TInput : class
            where TPrediction : class, new()
            where TLoader : ModelLoader
        {
            // adds model loader to DI
            builder.Services.TryAdd(ServiceDescriptor.Describe(typeof(TLoader), typeof(TLoader), serviceLifetime));

            // adds configuration for model file and model result file
            builder.Services.Configure <ModelLoderFileOptions>(
                builder.ModelName,
                options =>
            {
                options.ModelName           = builder.ModelName;
                options.ModelResultFileName = $"{options.ModelName}.json";
                options.ModelFileName       = $"{options.ModelName}.zip";

                // overrides the defaults
                configure?.Invoke(options);
            });

            // adds model loader options to be used.
            builder.Services.AddOptions <ModelLoaderOptions>(builder.ModelName)
            .Configure <IServiceProvider, TLoader>(
                (options, sp, loader) =>
            {
                var setupOptions = sp.GetRequiredService <IOptionsMonitor <ModelLoderFileOptions> >().Get(builder.ModelName);
                loader.Setup(setupOptions);

                options.ModalLoader = loader;
            });
            return(builder);
        }
        public static IServiceCollection AddModelLoader <TInput, TLoader>(
            this IServiceCollection services,
            string modelName,
            Action <ModelLoderFileOptions>?configure = null,
            ServiceLifetime serviceLifetime          = ServiceLifetime.Transient)
            where TInput : class
            where TLoader : ModelLoader
        {
            // adds model loader to DI
            services.TryAdd(ServiceDescriptor.Describe(typeof(TLoader), typeof(TLoader), serviceLifetime));

            // adds configuration for model file and model result file
            services.Configure <ModelLoderFileOptions>(
                modelName,
                options =>
            {
                options.ModelName           = modelName;
                options.WatchForChanges     = false;
                options.ModelResultFileName = $"{options.ModelName}.json";
                options.ModelFileName       = $"{options.ModelName}.zip";

                configure?.Invoke(options);
            });

            // adds model loader options to be used.
            services.AddOptions <ModelLoaderOptions>(modelName)
            .Configure <IServiceProvider, TLoader>(
                (options, sp, loader) =>
            {
                var setupOptions = sp.GetRequiredService <IOptionsMonitor <ModelLoderFileOptions> >().Get(modelName);
                loader.Setup(setupOptions);

                options.ModalLoader = loader;
            });
            return(services);
        }
        public static IServiceCollection AddSourceLoader <TInput, TLoader>(
            this IServiceCollection services,
            string modelName,
            Action <SourceLoaderFileOptions <TInput> > configure,
            ServiceLifetime serviceLifetime = ServiceLifetime.Transient)
            where TInput : class
            where TLoader : SourceLoader <TInput>
        {
            // adds source loader into DI
            services.TryAdd(ServiceDescriptor.Describe(typeof(TLoader), typeof(TLoader), serviceLifetime));

            // add file options configurations.
            services.Configure <SourceLoaderFileOptions <TInput> >(modelName, options => configure(options));

            // create source loader options
            services.AddOptions <SourceLoaderOptions <TInput> >(modelName)
            .Configure <IServiceProvider, TLoader>(
                (options, sp, loader) =>
            {
                loader.Setup(sp, modelName);
                options.SourceLoader = loader;
            });
            return(services);
        }
        /// <summary>
        /// Adds Web Api Header Authetnication.
        /// </summary>
        /// <typeparam name="TApiUserStore"></typeparam>
        /// <param name="services"></param>
        /// <param name="configure"></param>
        /// <param name="configApiUserStoreOptions"></param>
        /// <returns></returns>
        public static IServiceCollection AddApiKeyHeaderAuthentication <TApiUserStore>(
            this IServiceCollection services,
            Action <ApiKeyAuthenticationOptions> configure,
            Action <ApiUserStoreOptions, IConfiguration>?configApiUserStoreOptions = default)
            where TApiUserStore : IApiUserStore
        {
            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = ApiKeyAuthenticationOptions.DefaultScheme;
                options.DefaultChallengeScheme    = ApiKeyAuthenticationOptions.DefaultScheme;
            }).AddApiKeyHeaderSupport(configure);

            services.AddChangeTokenOptions <ApiUserStoreOptions>(
                nameof(ApiUserStoreOptions),
                nameof(InMemoryApiUserStore),
                (o, c) => configApiUserStoreOptions?.Invoke(o, c));

            services.TryAdd(ServiceDescriptor.Describe(
                                typeof(IApiUserStore),
                                typeof(TApiUserStore),
                                ServiceLifetime.Scoped));

            return(services);
        }
Exemple #23
0
 public static IServiceCollection AddDestinyInterface(this IServiceCollection sc, Type serviceType, ServiceLifetime lifetime = ServiceLifetime.Singleton)
 {
     sc.Add(ServiceDescriptor.Describe(serviceType, typeof(DefaultImplementAttribute), lifetime));
     return(sc);
 }
        private static ServiceDescriptor CreateDecoratorDescriptor(this ServiceDescriptor innerDescriptor, Type decoratorType)
        {
            Func <IServiceProvider, object> factory = provider => provider.CreateInstance(decoratorType, provider.GetInstance(innerDescriptor));

            return(ServiceDescriptor.Describe(innerDescriptor.ServiceType, factory, innerDescriptor.Lifetime));
        }
Exemple #25
0
        public static IServiceCollection TryAdd(this IServiceCollection services, Type serviceType, ServiceLifetime lifetime)
        {
            services.TryAdd(ServiceDescriptor.Describe(serviceType, serviceType, lifetime));

            return(services);
        }
 private static ServiceDescriptor WithFactory(this ServiceDescriptor descriptor, Func <IServiceProvider, object> factory)
 {
     return(ServiceDescriptor.Describe(descriptor.ServiceType, factory, descriptor.Lifetime));
 }
 public static IServiceCollection AddNpoiOffice(this IServiceCollection services, ServiceLifetime serviceLifetime = ServiceLifetime.Singleton)
 {
     services.TryAdd(ServiceDescriptor.Describe(typeof(IOffice), typeof(NPOIOffice), serviceLifetime));
     return(services);
 }
Exemple #28
0
 /// <summary>
 ///
 /// </summary>
 /// <typeparam name="TService"></typeparam>
 /// <typeparam name="TSourceImplementation"></typeparam>
 /// <typeparam name="TDestinationImplementation"></typeparam>
 /// <param name="services"></param>
 /// <param name="lifetime"></param>
 /// <returns></returns>
 public static IServiceCollection ReplaceEnumerable <TService, TSourceImplementation, TDestinationImplementation>(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Transient)
     where TService : class
     where TSourceImplementation : class, TService
     where TDestinationImplementation : class, TService => services.ReplaceEnumerable(ServiceDescriptor.Transient <TService, TSourceImplementation>(), ServiceDescriptor.Describe(typeof(TService), typeof(TDestinationImplementation), lifetime));
Exemple #29
0
        public static IServiceCollection TryAdd <TService>(this IServiceCollection services, ServiceLifetime lifetime) where TService : class
        {
            services.TryAdd(ServiceDescriptor.Describe(typeof(TService), typeof(TService), lifetime));

            return(services);
        }
Exemple #30
0
 private static IServiceCollection Add(this IServiceCollection services, ServiceDefinition service)
 {
     services.Add(ServiceDescriptor.Describe(service.ServiceType, service.ImplementationType, service.Lifetime));
     return(services);
 }