示例#1
0
        /// <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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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>();
        }