private void RegisterValidators(IServiceCollection serviceCollection) { var typeSearcher = new AppTypeSearcher(); var validators = typeSearcher.ClassesOfType(typeof(IValidator)).ToList(); foreach (var validator in validators) { serviceCollection.AddTransient(validator); } //validator consumers var validatorconsumers = typeSearcher.ClassesOfType(typeof(IValidatorConsumer <>)).ToList(); foreach (var consumer in validatorconsumers) { var types = consumer.GetTypeInfo().FindInterfaces((type, criteria) => { var isMatch = type.GetTypeInfo().IsGenericType&& ((Type)criteria).IsAssignableFrom(type.GetGenericTypeDefinition()); return(isMatch); }, typeof(IValidatorConsumer <>)); foreach (var item in types) { serviceCollection.AddScoped(item, consumer); } } }
/// <summary> /// Adds authentication service /// </summary> /// <param name="services">Collection of service descriptors</param> public static void AddGrandAuthentication(this IServiceCollection services, IConfiguration configuration) { var config = new AppConfig(); configuration.GetSection("Application").Bind(config); //set default authentication schemes var authenticationBuilder = services.AddAuthentication(options => { options.DefaultScheme = GrandCookieAuthenticationDefaults.AuthenticationScheme; options.DefaultSignInScheme = GrandCookieAuthenticationDefaults.ExternalAuthenticationScheme; }); //add main cookie authentication authenticationBuilder.AddCookie(GrandCookieAuthenticationDefaults.AuthenticationScheme, options => { options.Cookie.Name = config.CookiePrefix + GrandCookieAuthenticationDefaults.AuthenticationScheme; options.Cookie.HttpOnly = true; options.LoginPath = GrandCookieAuthenticationDefaults.LoginPath; options.AccessDeniedPath = GrandCookieAuthenticationDefaults.AccessDeniedPath; options.Cookie.SecurePolicy = config.CookieSecurePolicyAlways ? CookieSecurePolicy.Always : CookieSecurePolicy.SameAsRequest; }); //add external authentication authenticationBuilder.AddCookie(GrandCookieAuthenticationDefaults.ExternalAuthenticationScheme, options => { options.Cookie.Name = config.CookiePrefix + GrandCookieAuthenticationDefaults.ExternalAuthenticationScheme; options.Cookie.HttpOnly = true; options.LoginPath = GrandCookieAuthenticationDefaults.LoginPath; options.AccessDeniedPath = GrandCookieAuthenticationDefaults.AccessDeniedPath; options.Cookie.SecurePolicy = config.CookieSecurePolicyAlways ? CookieSecurePolicy.Always : CookieSecurePolicy.SameAsRequest; }); //register external authentication plugins now var typeSearcher = new AppTypeSearcher(); var externalAuthConfigurations = typeSearcher.ClassesOfType <IAuthenticationBuilder>(); var externalAuthInstances = externalAuthConfigurations .Where(x => PluginExtensions.OnlyInstalledPlugins(x)) .Select(x => (IAuthenticationBuilder)Activator.CreateInstance(x)) .OrderBy(x => x.Priority); //add new Authentication foreach (var instance in externalAuthInstances) { instance.AddAuthentication(authenticationBuilder, configuration); } }
private void RegisterDependencies(ODataConventionModelBuilder builder, ApiConfig apiConfig) { var typeFinder = new AppTypeSearcher(); //find dependency provided by other assemblies var dependencyInject = typeFinder.ClassesOfType <IDependencyEdmModel>(); //create and sort instances of dependency inject var instances = dependencyInject .Select(di => (IDependencyEdmModel)Activator.CreateInstance(di)) .OrderBy(di => di.Order); //register all provided dependencies foreach (var dependencyRegistrar in instances) { dependencyRegistrar.Register(builder, apiConfig); } }
/// <summary> /// Configure HTTP request pipeline /// </summary> /// <param name="application">Builder for configuring an application's request pipeline</param> /// <param name="webHostEnvironment">WebHostEnvironment</param> public static void ConfigureRequestPipeline(IApplicationBuilder application, IWebHostEnvironment webHostEnvironment) { //find startup configurations provided by other assemblies var typeSearcher = new AppTypeSearcher(); var startupConfigurations = typeSearcher.ClassesOfType <IStartupApplication>(); //create and sort instances of startup configurations var instances = startupConfigurations .Where(startup => PluginExtensions.OnlyInstalledPlugins(startup)) .Select(startup => (IStartupApplication)Activator.CreateInstance(startup)) .OrderBy(startup => startup.Priority); //configure request pipeline foreach (var instance in instances) { instance.Configure(application, webHostEnvironment); } }
/// <summary> /// Add and configure any of the middleware /// </summary> /// <param name="services">Collection of service descriptors</param> /// <param name="configuration">Configuration root of the application</param> public void ConfigureServices(IServiceCollection services, IConfiguration configuration) { //database is already installed, so start scheduled tasks if (DataSettingsManager.DatabaseIsInstalled()) { var typeSearcher = new AppTypeSearcher(); var scheduleTasks = typeSearcher.ClassesOfType <IScheduleTask>(); var scheduleTasksInstalled = scheduleTasks .Where(t => PluginExtensions.OnlyInstalledPlugins(t)); //ignore not installed plugins foreach (var task in scheduleTasksInstalled) { var assemblyName = task.Assembly.GetName().Name; services.AddSingleton <IHostedService, BackgroundServiceTask>(sp => { return(new BackgroundServiceTask($"{task.FullName}, {assemblyName}", sp)); }); } } }
public static void AddSettings(this IServiceCollection services) { var typeSearcher = new AppTypeSearcher(); var settings = typeSearcher.ClassesOfType <ISettings>(); var instances = settings.Select(x => (ISettings)Activator.CreateInstance(x)); foreach (var item in instances) { services.AddScoped(item.GetType(), (x) => { var type = item.GetType(); var storeId = ""; var settingService = x.GetRequiredService <ISettingService>(); var store = x.GetRequiredService <IStoreHelper>().HostStore; if (store != null) { storeId = store.Id; } return(settingService.LoadSetting(type, storeId)); }); } }
/// <summary> /// Add and configure services /// </summary> /// <param name="services">Collection of service descriptors</param> /// <param name="configuration">Configuration root of the application</param> public static void ConfigureServices(IServiceCollection services, IConfiguration configuration) { //register application var mvcBuilder = RegisterApplication(services, configuration); //register extensions RegisterExtensions(mvcBuilder, configuration); //find startup configurations provided by other assemblies var typeSearcher = new AppTypeSearcher(); services.AddSingleton <ITypeSearcher>(typeSearcher); var startupConfigurations = typeSearcher.ClassesOfType <IStartupApplication>(); //Register startup var instancesBefore = startupConfigurations .Where(startup => PluginExtensions.OnlyInstalledPlugins(startup)) .Select(startup => (IStartupApplication)Activator.CreateInstance(startup)) .Where(startup => startup.BeforeConfigure) .OrderBy(startup => startup.Priority); //configure services foreach (var instance in instancesBefore) { instance.ConfigureServices(services, configuration); } //register mapper configurations InitAutoMapper(typeSearcher); //add fluenvalidation AddFluentValidation(mvcBuilder, typeSearcher); //Register custom type converters RegisterTypeConverter(typeSearcher); var config = new AppConfig(); configuration.GetSection("Application").Bind(config); //run startup tasks if (!config.IgnoreStartupTasks) { ExecuteStartupTasks(typeSearcher); } //add mediator AddMediator(services, typeSearcher); //Add MassTransit AddMassTransitRabbitMq(services, config, typeSearcher); //Register startup var instancesAfter = startupConfigurations .Where(startup => PluginExtensions.OnlyInstalledPlugins(startup)) .Select(startup => (IStartupApplication)Activator.CreateInstance(startup)) .Where(startup => !startup.BeforeConfigure) .OrderBy(startup => startup.Priority); //configure services foreach (var instance in instancesAfter) { instance.ConfigureServices(services, configuration); } }
/// <summary> /// Add Mass Transit rabitMq message broker /// </summary> /// <param name="services"></param> private static void AddMassTransitRabbitMq(IServiceCollection services, AppConfig config, AppTypeSearcher typeSearcher) { if (!config.RabbitEnabled) { return; } services.AddMassTransit(x => { x.AddConsumers(q => !q.Equals(typeof(CacheMessageEventConsumer)), typeSearcher.GetAssemblies().ToArray()); // reddits have more priority if (!config.RedisPubSubEnabled && config.RabbitCachePubSubEnabled) { x.AddConsumer <CacheMessageEventConsumer>().Endpoint(t => t.Name = config.RabbitCacheReceiveEndpoint); } x.UsingRabbitMq((context, cfg) => { cfg.Host(config.RabbitHostName, config.RabbitVirtualHost, h => { h.Password(config.RabbitPassword); h.Username(config.RabbitUsername); }); cfg.ConfigureEndpoints(context); }); }); //for automaticly start/stop bus services.AddMassTransitHostedService(); }
/// <summary> /// Adds services for mediatR /// </summary> /// <param name="services">Collection of service descriptors</param> private static void AddMediator(this IServiceCollection services, AppTypeSearcher typeSearcher) { var assemblies = typeSearcher.GetAssemblies().ToArray(); services.AddMediatR(assemblies); }