Пример #1
0
        private static IContainer SetupContainer(IServiceCollection services)
        {
            ContainerBuilder builder = new ContainerBuilder();
            var cloudStorageAccount  = ServiceFabricConfiguration.GetCloudStorageAccount();
            var cosmosAccount        = ServiceFabricConfiguration.GetCloudCosmosAccount();

            builder.Register(c => cloudStorageAccount).Named <CloudStorageAccount>("azure-storage");
            builder.Register(c => cosmosAccount).Named <CloudStorageAccount>("cosmos-storage");
            builder
            .RegisterGeneric(typeof(AzureBlobContainer <>))
            .WithParameter(
                new ResolvedParameter(
                    (p, c) => p.Name == "account",
                    (p, c) => c.ResolveNamed <CloudStorageAccount>("azure-storage")))
            .As(typeof(IAzureBlobContainer <>));
            //builder.RegisterGeneric(typeof(AzureBlobContainer<>))
            //    .As(typeof(IAzureBlobContainer<>));
            builder
            .RegisterGeneric(typeof(AzureTable <>))
            .WithParameter(
                new ResolvedParameter(
                    (p, c) => p.Name == "account",
                    (p, c) => c.ResolveNamed <CloudStorageAccount>("cosmos-storage")))
            .As(typeof(IAzureTable <>));
            //builder.RegisterGeneric(typeof(AzureTable<>))
            //    .As(typeof(IAzureTable<>));
            builder.Populate(services);
            return(builder.Build());
        }
Пример #2
0
        private async Task AppendSurveyAnswerIdToSurveyAnswerListAsync(string slugName, string surveyAnswerId)
        {
            var SurveyAnswersListContainerName = "surveyanswerslist";

            if (string.IsNullOrWhiteSpace(slugName))
            {
                throw new ArgumentException($"{nameof(slugName)} cannot be null, empty, or only whitespace");
            }

            if (string.IsNullOrWhiteSpace(surveyAnswerId))
            {
                throw new ArgumentException($"{nameof(surveyAnswerId)} cannot be null, empty, or only whitespace");
            }

            var answerListContainer = new AzureBlobContainer <List <string> >(
                ServiceFabricConfiguration.GetCloudStorageAccount(), SurveyAnswersListContainerName);

            try
            {
                await SaveAsync(answerListContainer, slugName, surveyAnswerId);
            }
            catch (StorageException ex)
            {
                if (ex.Message.Contains("404"))
                {
                    await answerListContainer.EnsureExistsAsync();
                    await SaveAsync(answerListContainer, slugName, surveyAnswerId);
                }
                else
                {
                    throw ex;
                }
            }
        }
Пример #3
0
        private static IContainer SetupContainer()
        {
            ContainerBuilder builder = new ContainerBuilder();
            var cloudStorageAccount  = ServiceFabricConfiguration.GetCloudStorageAccount();

            builder.RegisterInstance(cloudStorageAccount);
            builder.RegisterGeneric(typeof(AzureBlobContainer <>))
            .As(typeof(IAzureBlobContainer <>));
            builder.Register(c => ServiceProxy.Create <ISurveyAnalysisService>(new Uri("fabric:/Tailspin.SurveyAnalysisService.Application/SurveyAnalysisService")))
            .As <ISurveyAnalysisService>();
            return(builder.Build());
        }
        private static IContainer SetupContainer()
        {
            ContainerBuilder builder = new ContainerBuilder();
            var cloudStorageAccount  = ServiceFabricConfiguration.GetCloudStorageAccount();

            builder.RegisterInstance(cloudStorageAccount);
            builder.RegisterGeneric(typeof(AzureBlobContainer <>))
            .As(typeof(IAzureBlobContainer <>));
            builder.RegisterGeneric(typeof(AzureTable <>))
            .As(typeof(IAzureTable <>));
            return(builder.Build());
        }
Пример #5
0
        private static IContainer SetupContainer()
        {
            ContainerBuilder builder = new ContainerBuilder();
            var cloudStorageAccount  = ServiceFabricConfiguration.GetCloudStorageAccount();

            builder.RegisterInstance(cloudStorageAccount);
            builder.RegisterGeneric(typeof(AzureBlobContainer <>))
            .As(typeof(IAzureBlobContainer <>));
            builder.Register(c => new Tailspin.SurveyAnalysisService.Client.SurveyAnalysisService())
            .As <ISurveyAnalysisService>();
            return(builder.Build());
        }
Пример #6
0
        public AnswerAnalysisService(StatelessServiceContext context)
            : base(context)
        {
            // The number of connections depends on the particular usage in each application
            ServicePointManager.DefaultConnectionLimit = 12;

            var account = ServiceFabricConfiguration.GetCloudStorageAccount();

            // TODO: Initialize DI container here or somewhere else since for each instance this constructor is invoked
            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterModule <ContainerBootstrapperModule>();
            containerBuilder.RegisterInstance(account);
            _container = containerBuilder.Build();

            _container.Resolve <ISurveyAnswerStore>().InitializeAsync().Wait();
            _container.Resolve <ISurveyAnswersSummaryStore>().InitializeAsync().Wait();
            _container.Resolve <ITenantStore>().InitializeAsync().Wait();
            _container.Resolve <ISurveyStore>().InitializeAsync().Wait();
            _container.Resolve <ISurveyTransferStore>().InitializeAsync().Wait();
        }
Пример #7
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            // Add framework services.

            // Persist data protection keys in Redis
            var redisConnectionString = ServiceFabricConfiguration.GetConfigurationSettingValue("ConnectionStrings", "RedisCacheConnectionString", "YourRedisCacheConnectionString");

            services.AddDataProtection()
            .PersistKeysToRedis(ConnectionMultiplexer.Connect(redisConnectionString), "DataProtection-Keys");

            // Add Redis-based distributed cache
            services.AddSingleton <IDistributedCache>(serviceProvider =>
                                                      new RedisCache(new RedisCacheOptions
            {
                Configuration = redisConnectionString
            }));
            services.AddSession();
            services.AddMvc();

            var account = ServiceFabricConfiguration.GetCloudStorageAccount();

            // Add Autofac
            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterModule <ContainerBootstrapperModule>();
            containerBuilder.Populate(services);
            containerBuilder.RegisterInstance(account);
            var container = containerBuilder.Build();

            container.Resolve <ISurveyStore>().InitializeAsync().Wait();
            container.Resolve <ISurveyAnswerStore>().InitializeAsync().Wait();
            container.Resolve <ISurveyAnswersSummaryStore>().InitializeAsync().Wait();
            container.Resolve <ISurveyTransferStore>().InitializeAsync().Wait();
            container.Resolve <ITenantStore>().InitializeAsync().Wait();

            return(new AutofacServiceProvider(container));
        }
Пример #8
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            // Add framework services.

            // Persist data protection keys in Redis
            var redisConnectionString = ServiceFabricConfiguration.GetConfigurationSettingValue("ConnectionStrings", "RedisCacheConnectionString", "YourRedisCacheConnectionString");

            services.AddDataProtection()
            .PersistKeysToRedis(ConnectionMultiplexer.Connect(redisConnectionString), "DataProtection-Keys");

            services.AddMvc();

            var account = ServiceFabricConfiguration.GetCloudStorageAccount();

            // Add Autofac
            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterModule <ContainerBootstrapperModule>();
            containerBuilder.Populate(services);
            containerBuilder.RegisterInstance(account);
            var container = containerBuilder.Build();

            return(new AutofacServiceProvider(container));
        }
Пример #9
0
        protected override async Task RunAsync(CancellationToken cancellationToken)
        {
            int  batchSize = 100;
            long delayMs   = 20;

            surveyQueue = await this.StateManager.GetOrAddAsync <IReliableConcurrentQueue <ClientModels.SurveyAnswer> >("surveyQueue");

            ISurveyAnalysisService surveyAnalysisService = new Tailspin.SurveyAnalysisService.Client.SurveyAnalysisService();

            List <ClientModels.SurveyAnswer> processItems = new List <ClientModels.SurveyAnswer>();

            try
            {
                while (!cancellationToken.IsCancellationRequested)
                {
                    cancellationToken.ThrowIfCancellationRequested();

                    using (var tx = this.StateManager.CreateTransaction())
                    {
                        ConditionalValue <ClientModels.SurveyAnswer> ret;

                        for (int i = 0; i < batchSize; ++i)
                        {
                            ret = await surveyQueue.TryDequeueAsync(tx, cancellationToken);

                            if (ret.HasValue)
                            {
                                processItems.Add(ret.Value.DeepCopy());
                            }
                            else
                            {
                                break;
                            }
                        }

                        if (processItems.Count > 0)
                        {
                            foreach (var sa in processItems)
                            {
                                var model = sa.ToSurveyAnswer();
                                model.CreatedOn = DateTime.UtcNow;

                                var container = new AzureBlobContainer <ApiModels.SurveyAnswer>(
                                    ServiceFabricConfiguration.GetCloudStorageAccount(),
                                    $"{model.SlugName}-answers");

                                try
                                {
                                    await container.SaveAsync(model.Id, model);
                                }
                                catch (StorageException ex)
                                {
                                    if (ex.Message.Contains("404"))
                                    {
                                        await container.EnsureExistsAsync();

                                        await container.SaveAsync(model.Id, model);
                                    }
                                    else
                                    {
                                        throw ex;
                                    }
                                }

                                await this.AppendSurveyAnswerIdToSurveyAnswerListAsync(model.SlugName, model.Id);

                                await surveyAnalysisService.MergeSurveyAnswerToAnalysisAsync(model.ToAnalysisServiceSurveyAnswer());
                            }

                            processItems.Clear();
                        }

                        await tx.CommitAsync();
                    }

                    await Task.Delay(TimeSpan.FromMilliseconds(delayMs), cancellationToken);
                }
            }
            catch (Exception ex)
            {
                ServiceEventSource.Current.ServiceRequestFailed(ex.ToString());
                throw;
            }
        }