/// <summary> /// Adds Carter to the specified <see cref="IServiceCollection"/>. /// </summary> /// <param name="services">The <see cref="IServiceCollection"/> to add Carter to.</param> /// <param name="assemblyCatalog">Optional <see cref="DependencyContextAssemblyCatalog"/> containing assemblies to add to the services collection. If not provided, the default catalog of assemblies is added, which includes Assembly.GetEntryAssembly.</param> /// <param name="configurator">Optional <see cref="CarterConfigurator"/> to enable registration of specific types within Carter</param> public static void AddCarter(this IServiceCollection services, DependencyContextAssemblyCatalog assemblyCatalog = null, Action <CarterConfigurator> configurator = null) { assemblyCatalog = assemblyCatalog ?? new DependencyContextAssemblyCatalog(); var config = new CarterConfigurator(); configurator?.Invoke(config); WireupCarter(services, assemblyCatalog, config); }
private static IEnumerable <Type> GetValidators(CarterConfigurator carterConfigurator, IReadOnlyCollection <Assembly> assemblies) { IEnumerable <Type> validators; if (!carterConfigurator.ValidatorTypes.Any()) { validators = assemblies.SelectMany(ass => ass.GetTypes()) .Where(typeof(IValidator).IsAssignableFrom) .Where(t => !t.GetTypeInfo().IsAbstract); carterConfigurator.ValidatorTypes.AddRange(validators); } else { validators = carterConfigurator.ValidatorTypes; } return(validators); }
private static IEnumerable <Type> GetStatusCodeHandlers(CarterConfigurator carterConfigurator, IReadOnlyCollection <Assembly> assemblies) { IEnumerable <Type> statusCodeHandlers; if (!carterConfigurator.StatusCodeHandlerTypes.Any()) { statusCodeHandlers = assemblies.SelectMany(x => x.GetTypes().Where(t => typeof(IStatusCodeHandler).IsAssignableFrom(t) && t != typeof(IStatusCodeHandler))); carterConfigurator.StatusCodeHandlerTypes.AddRange(statusCodeHandlers); } else { statusCodeHandlers = carterConfigurator.StatusCodeHandlerTypes; } return(statusCodeHandlers); }
private static IEnumerable <Type> GetModules(CarterConfigurator carterConfigurator, IReadOnlyCollection <Assembly> assemblies) { IEnumerable <Type> modules; if (!carterConfigurator.ModuleTypes.Any()) { modules = assemblies.SelectMany(x => x.GetTypes() .Where(t => !t.IsAbstract && typeof(CarterModule).IsAssignableFrom(t) && t != typeof(CarterModule) && t.IsPublic )); carterConfigurator.ModuleTypes.AddRange(modules); } else { modules = carterConfigurator.ModuleTypes; } return(modules); }
private static IEnumerable <Type> GetResponseNegotiators(CarterConfigurator carterConfigurator, IReadOnlyCollection <Assembly> assemblies) { IEnumerable <Type> responseNegotiators; if (!carterConfigurator.ResponseNegotiatorTypes.Any()) { responseNegotiators = assemblies.SelectMany(x => x.GetTypes() .Where(t => !t.IsAbstract && typeof(IResponseNegotiator).IsAssignableFrom(t) && t != typeof(IResponseNegotiator) && t != typeof(DefaultJsonResponseNegotiator) )); carterConfigurator.ResponseNegotiatorTypes.AddRange(responseNegotiators); } else { responseNegotiators = carterConfigurator.ResponseNegotiatorTypes; } return(responseNegotiators); }
private static Type GetModelBinder(CarterConfigurator carterConfigurator, IReadOnlyCollection <Assembly> assemblies) { Type modelBinder; if (carterConfigurator.ModelBinder == null) { modelBinder = assemblies.SelectMany(x => x.GetTypes() .Where(t => !t.IsAbstract && typeof(IModelBinder).IsAssignableFrom(t) && t != typeof(IModelBinder) && t != typeof(NewtonsoftJsonModelBinder) && t != typeof(DefaultJsonModelBinder) )).FirstOrDefault(); carterConfigurator.ModelBinder = modelBinder; } else { modelBinder = carterConfigurator.ModelBinder; } return(modelBinder); }
private static void WireupCarter(this IServiceCollection services, DependencyContextAssemblyCatalog assemblyCatalog, CarterConfigurator carterConfigurator) { var assemblies = assemblyCatalog.GetAssemblies(); var validators = GetValidators(carterConfigurator, assemblies); var modules = GetModules(carterConfigurator, assemblies); var statusCodeHandlers = GetStatusCodeHandlers(carterConfigurator, assemblies); var responseNegotiators = GetResponseNegotiators(carterConfigurator, assemblies); services.AddSingleton(carterConfigurator); foreach (var validator in validators) { services.AddSingleton(typeof(IValidator), validator); } services.AddSingleton <IValidatorLocator, DefaultValidatorLocator>(); services.AddRouting(); foreach (var module in modules) { services.AddScoped(module); services.AddScoped(typeof(CarterModule), module); } foreach (var sch in statusCodeHandlers) { services.AddScoped(typeof(IStatusCodeHandler), sch); } foreach (var negotiator in responseNegotiators) { services.AddSingleton(typeof(IResponseNegotiator), negotiator); } services.AddSingleton <IResponseNegotiator, DefaultJsonResponseNegotiator>(); }