Exemplo n.º 1
0
 public TrackerController
 (
     SingleThreadAsyncDequeueProcessorSlim <JToken>
     asyncDequeueProcessor
 )
 {
     _asyncDequeueProcessor = asyncDequeueProcessor;
 }
        public void ConfigureServices(IServiceCollection services)
        {
            ConfigurationHelper
            .Load(Configuration);

            services
            .Configure <CsvFormatterOptions>
            (
                Configuration
                .GetSection
                (
                    "ExportCsvFormatter"
                )
            );
            services
            .AddMvc
            (
#if NETCOREAPP3_X
                (option) =>
            {
                option.EnableEndpointRouting = false;
            }
#endif
            )
#if NETCOREAPP3_X
            .AddNewtonsoftJson()
#endif
            //.SetCompatibilityVersion
            //    (
            //        CompatibilityVersion
            //            .Version_2_1
            //    )
            ;

            // for both NETCOREAPP2_X and NETCOREAPP3_X
            // for Sync or Async Action Selector
            services
            .TryAddEnumerable
            (
                ServiceDescriptor
                .Singleton
                <
                    IApplicationModelProvider
                    , ConfigurableActionConstrainedRouteApplicationModelProvider <ConstrainedRouteAttribute>
                >
                (
                    (x) =>
            {
                return
                (new ConfigurableActionConstrainedRouteApplicationModelProvider <ConstrainedRouteAttribute>
                 (
                     Configuration
                     , (attribute) =>
                {
                    return
                    new ConfigurableActionConstraint <ConstrainedRouteAttribute>
                    (
                        attribute
                        , (actionConstraintContext, constrainedRouteAttribute) =>
                    {
                        var r = (actionConstraintContext.Candidates.Count == 1);
                        if (!r)
                        {
                            var routeContext = actionConstraintContext.RouteContext;
                            var httpContext = routeContext
                                              .HttpContext;
                            var request = httpContext
                                          .Request;
                            var type = typeof(AbstractStoreProceduresExecutorControllerBase);
                            var currentCandidateAction = actionConstraintContext
                                                         .CurrentCandidate
                                                         .Action;

                            var isAsyncExecuting = ((ControllerActionDescriptor)currentCandidateAction)
                                                   .MethodInfo
                                                   .IsAsync();
                            var routeName = routeContext
                                            .RouteData
                                            .Values["routeName"]
                                            .ToString();
                            var httpMethod = $"Http{request.Method}";
                            var isAsyncExecutingInConfiguration = false;

                            var accessingConfigurationKey = "DefaultAccessing";
                            if (request.Path.ToString().Contains("/export/", StringComparison.OrdinalIgnoreCase))
                            {
                                accessingConfigurationKey = "exporting";
                            }

                            if
                            (
                                constrainedRouteAttribute
                                .Configuration
                                .TryGetSection
                                (
                                    $"Routes:{routeName}:{httpMethod}:{accessingConfigurationKey}:isAsyncExecuting"
                                    , out var isAsyncExecutingConfiguration
                                )
                            )
                            {
                                isAsyncExecutingInConfiguration = isAsyncExecutingConfiguration.Get <bool>();
                            }
                            r = (isAsyncExecutingInConfiguration == isAsyncExecuting);
                        }
                        return r;
                    }
                    );
                }
                 ));
            }
                )
            );

            //services
            //  .AddSingleton
            //        <JTokenParametersValidateFilterAttribute>
            //            ();

            #region 异步批量入库案例专用
            var processor =
                new SingleThreadAsyncDequeueProcessorSlim <JToken>();
            ConcurrentDictionary <string, ExecutingInfo>
            executingCachingStore
                = new ConcurrentDictionary <string, ExecutingInfo>();
            services
            .AddSingleton(executingCachingStore);
            var executor = new MsSqlStoreProceduresExecutor(executingCachingStore);
            processor
            .StartRunDequeueThreadProcess
            (
                (i, data) =>
            {
                //Debugger.Break();
                var ja = new JArray(data);
                var jo = new JObject
                {
                    ["udt_vcidt"] = ja
                };
                var sqlConnection = new SqlConnection("Initial Catalog=test;Data Source=localhost;User=sa;Password=!@#123QWE");
                executor
                .ExecuteJsonResults
                (
                    sqlConnection
                    , "zsp_Test"
                    , jo
                    ,
                    (
                        resultSetIndex
                        , reader
                        , rowIndex
                        , columnIndex
                        , fieldType
                        , fieldName
                    )
                    =>
                {
                    return(true, null);
                }
                );
            }