예제 #1
0
        public void Configuration(IAppBuilder app)
        {
            var loggerFactory = Settings.Current.GetLoggerFactory();
            var logger        = loggerFactory.CreateLogger("AppBuilder");

            ConfigureAuth(app);

            var container = CreateContainer(loggerFactory, logger);

            GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);

            var resolver = new SimpleInjectorSignalRDependencyResolver(container);

            if (Settings.Current.EnableRedis)
            {
                resolver.UseRedis(new RedisScaleoutConfiguration(Settings.Current.RedisConnectionString, "sample.signalr"));
            }

            app.MapSignalR(new HubConfiguration {
                Resolver             = resolver,
                EnableDetailedErrors = true
            });

            VerifyContainer(container);

            app.UseWebApi(GlobalConfiguration.Configuration);

            RunJobs(loggerFactory);
        }
예제 #2
0
        public void RegisterServices(Container container) {
            container.Register<IUserIdProvider, PrincipalUserIdProvider>();
            container.Register<MessageBusConnection>();
            container.RegisterSingleton<ConnectionMapping>();
            container.RegisterSingleton<MessageBusBroker>();

            var resolver = new SimpleInjectorSignalRDependencyResolver(container);
            container.RegisterSingleton<IDependencyResolver>(resolver);
            container.RegisterSingleton<IConnectionManager>(() => new ConnectionManager(resolver));

            container.RegisterSingleton<OverageHandler>();
            container.RegisterSingleton<ThrottlingHandler>(() => new ThrottlingHandler(container.GetInstance<ICacheClient>(), userIdentifier => Settings.Current.ApiThrottleLimit, TimeSpan.FromMinutes(15)));
        }
예제 #3
0
        public void RegisterServices(Container container)
        {
            container.Register <IUserIdProvider, PrincipalUserIdProvider>();
            container.Register <MessageBusConnection>();
            container.RegisterSingleton <ConnectionMapping>();
            container.RegisterSingleton <MessageBusBroker>();

            var resolver = new SimpleInjectorSignalRDependencyResolver(container);

            container.RegisterSingleton <IDependencyResolver>(resolver);
            container.RegisterSingleton <IConnectionManager>(() => new ConnectionManager(resolver));

            container.RegisterSingleton <OverageHandler>();
            container.RegisterSingleton <ThrottlingHandler>(() => new ThrottlingHandler(container.GetInstance <ICacheClient>(), userIdentifier => Settings.Current.ApiThrottleLimit, TimeSpan.FromMinutes(15)));
        }
예제 #4
0
        public static void RegisterServices(Container container, ILoggerFactory loggerFactory, CancellationToken shutdownCancellationToken)
        {
            container.Register <IUserIdProvider, PrincipalUserIdProvider>();
            container.Register <MessageBusConnection>();
            container.RegisterSingleton <IConnectionMapping, ConnectionMapping>();
            container.RegisterSingleton <MessageBusBroker>();

            var resolver = new SimpleInjectorSignalRDependencyResolver(container);

            container.RegisterSingleton <IDependencyResolver>(resolver);
            container.RegisterSingleton <IConnectionManager>(() => new ConnectionManager(resolver));

            container.RegisterSingleton <OverageHandler>();
            container.RegisterSingleton <ThrottlingHandler>(() => new ThrottlingHandler(container.GetInstance <ICacheClient>(), container.GetInstance <IMetricsClient>(), userIdentifier => Settings.Current.ApiThrottleLimit, TimeSpan.FromMinutes(15)));

            container.AppendToCollection(typeof(Profile), typeof(ApiMappings));
        }
예제 #5
0
        public static void BuildWithContainer(IAppBuilder app, Container container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }

            Config = new HttpConfiguration();
            ExceptionlessClient.Default.RegisterWebApi(Config);

            Log.Info().Message("Starting api...").Write();
            // if enabled, auto upgrade the database
            if (Settings.Current.ShouldAutoUpgradeDatabase)
            {
                var    url          = new MongoUrl(Settings.Current.MongoConnectionString);
                string databaseName = url.DatabaseName;
                if (Settings.Current.AppendMachineNameToDatabase)
                {
                    databaseName += String.Concat("-", Environment.MachineName.ToLower());
                }

                MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, databaseName);
            }

            Config.Services.Add(typeof(IExceptionLogger), new NLogExceptionLogger());
            Config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
            Config.Formatters.Remove(Config.Formatters.XmlFormatter);
            Config.Formatters.JsonFormatter.SerializerSettings.Formatting       = Formatting.Indented;
            Config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new LowerCaseUnderscorePropertyNamesContractResolver();

            var constraintResolver = new DefaultInlineConstraintResolver();

            constraintResolver.ConstraintMap.Add("objectid", typeof(ObjectIdRouteConstraint));
            constraintResolver.ConstraintMap.Add("objectids", typeof(ObjectIdsRouteConstraint));
            constraintResolver.ConstraintMap.Add("token", typeof(TokenRouteConstraint));
            constraintResolver.ConstraintMap.Add("tokens", typeof(TokensRouteConstraint));
            Config.MapHttpAttributeRoutes(constraintResolver);
            //Config.EnableSystemDiagnosticsTracing();

            container.RegisterSingle <JsonSerializer>(JsonSerializer.Create(new JsonSerializerSettings {
                ContractResolver = new SignalRContractResolver()
            }));
            container.RegisterWebApiFilterProvider(Config);

            try {
                container.Verify();
            } catch (Exception ex) {
                var tempEx = ex;
                while (!(tempEx is ReflectionTypeLoadException))
                {
                    if (tempEx.InnerException == null)
                    {
                        break;
                    }
                    tempEx = tempEx.InnerException;
                }

                var typeLoadException = tempEx as ReflectionTypeLoadException;
                if (typeLoadException != null)
                {
                    foreach (var loaderEx in typeLoadException.LoaderExceptions)
                    {
                        Debug.WriteLine(loaderEx.Message);
                    }
                }

                Debug.WriteLine(ex.Message);
                throw;
            }

            Config.MessageHandlers.Add(container.GetInstance <XHttpMethodOverrideDelegatingHandler>());
            Config.MessageHandlers.Add(container.GetInstance <EncodingDelegatingHandler>());
            Config.MessageHandlers.Add(container.GetInstance <AuthMessageHandler>());

            // Throttle api calls to X every 15 minutes by IP address.
            Config.MessageHandlers.Add(container.GetInstance <ThrottlingHandler>());

            // Reject event posts in orgs over their max event limits.
            Config.MessageHandlers.Add(container.GetInstance <OverageHandler>());

            app.UseCors(new CorsOptions {
                PolicyProvider = new CorsPolicyProvider
                {
                    PolicyResolver = ctx => Task.FromResult(new CorsPolicy
                    {
                        AllowAnyHeader      = true,
                        AllowAnyMethod      = true,
                        AllowAnyOrigin      = true,
                        SupportsCredentials = true,
                        PreflightMaxAge     = 60 * 5
                    })
                }
            });

            app.CreatePerContext <Lazy <User> >("User", ctx => new Lazy <User>(() => {
                if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated)
                {
                    return(null);
                }

                string userId = ctx.Request.User.GetUserId();
                if (String.IsNullOrEmpty(userId))
                {
                    return(null);
                }

                var userRepository = container.GetInstance <IUserRepository>();
                return(userRepository.GetById(userId, true));
            }));

            app.CreatePerContext <Lazy <Project> >("DefaultProject", ctx => new Lazy <Project>(() => {
                if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated)
                {
                    return(null);
                }

                // TODO: Use project id from url. E.G., /projects/{projectId:objectid}/events
                string projectId      = ctx.Request.User.GetDefaultProjectId();
                var projectRepository = container.GetInstance <IProjectRepository>();

                if (String.IsNullOrEmpty(projectId))
                {
                    var firstOrgId = ctx.Request.User.GetOrganizationIds().FirstOrDefault();
                    if (!String.IsNullOrEmpty(firstOrgId))
                    {
                        var project = projectRepository.GetByOrganizationId(firstOrgId, useCache: true).FirstOrDefault();
                        if (project != null)
                        {
                            return(project);
                        }
                    }

                    if (Settings.Current.WebsiteMode == WebsiteMode.Dev)
                    {
                        var dataHelper = container.GetInstance <DataHelper>();
                        // create a default org and project
                        projectId = dataHelper.CreateDefaultOrganizationAndProject(ctx.Request.GetUser());
                    }
                }

                if (String.IsNullOrEmpty(projectId))
                {
                    return(null);
                }

                return(projectRepository.GetById(projectId, true));
            }));

            app.UseWebApi(Config);
            var resolver = new SimpleInjectorSignalRDependencyResolver(container);

            if (Settings.Current.EnableRedis)
            {
                resolver.UseRedis(new RedisScaleoutConfiguration(Settings.Current.RedisConnectionString, "exceptionless.signalr"));
            }
            app.MapSignalR("/api/v2/push", new HubConfiguration {
                Resolver = resolver
            });

            Mapper.Configuration.ConstructServicesUsing(container.GetInstance);

            var context = new OwinContext(app.Properties);
            var token   = context.Get <CancellationToken>("host.OnAppDisposing");

            CreateSampleData(container);

            if (Settings.Current.RunJobsInProcess)
            {
                Task.Factory.StartNew(() => container.GetInstance <EventPostsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <EventUserDescriptionsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <MailMessageJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <EventNotificationsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <WebHooksJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<DailySummaryJob>().RunContinuousAsync(delay: TimeSpan.FromMinutes(15), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<RetentionLimitsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<StaleAccountsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
            }
        }
예제 #6
0
        public void Configuration(IAppBuilder app)
        {
            var container       = new Container();
            var httpConfig      = new HttpConfiguration();
            var signalrResolver = new SimpleInjectorSignalRDependencyResolver(container);

            container.RegisterContainer(httpConfig, app.GetDataProtectionProvider);

            // cross owin and simple injector for OnValidateIdentity
            app.CreatePerOwinContext(container.GetInstance <ApplicationUserManager>);

            // Enable the application to use a cookie to store information for the signed in user
            // and to use a cookie to temporarily store information about a user logging in with a third party login provider
            // Configure the sign in cookie
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath          = new PathString("/Account/Login"),
                Provider           = new CookieAuthenticationProvider
                {
                    // Enables the application to validate the security stamp when the user logs in.
                    // This is a security feature which is used when you change a password or add an external login to your account.
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity <ApplicationUserManager, User>(
                        validateInterval: TimeSpan.FromMinutes(5),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });

            app.MapScopableHubConnection(async(request, connectionId, next) =>
            {
                using (AsyncScopedLifestyle.BeginScope(container))
                {
                    if (container.GetInstance <IHubRequestAccessor>() is HubRequestAccessor hubRequestAccessor)
                    {
                        hubRequestAccessor.Request = request;
                    }

                    if (container.GetInstance <IHubConnectionIdAccessor>() is HubConnectionIdAccessor hubConnectionIdAccessor)
                    {
                        hubConnectionIdAccessor.ConnectionId = connectionId;
                    }

                    await next();
                }
            },
                                         resolver: signalrResolver);

            app.Use(async(context, next) =>
            {
                // check if there is a HttpContext for WebRequestLifestyle to store its scope
                if (HttpContext.Current != null)
                {
                    // capture the owin context for any service dependant on it and store it in the async scoped container
                    // this will use WebRequestLifestyle's cache
                    if (container.GetInstance <IOwinContextAccessor>() is OwinContextAccessor webrequestCallContextOwinContextAccessor)
                    {
                        webrequestCallContextOwinContextAccessor.CurrentContext = context;
                    }
                }

                using (AsyncScopedLifestyle.BeginScope(container))
                {
                    // capture the owin context for any service dependant on it and store it in the async scoped container
                    // this will use AsyncScopedLifestyle's cache
                    if (container.GetInstance <IOwinContextAccessor>() is OwinContextAccessor asyncCallContextOwinContextAccessor)
                    {
                        asyncCallContextOwinContextAccessor.CurrentContext = context;
                    }

                    await next();
                }
            });

            app.UseWebApi(httpConfig);

            AttackProcedures.LoadCovenantOwnersIntoRAM();
            DungeonProcedures.GenerateDungeon();

            // set chaos mode
            IPvPWorldStatRepository repo = new EFPvPWorldStatRepository();
            var data = repo.PvPWorldStats.FirstOrDefault();

            PvPStatics.ChaosMode     = data != null ? data.ChaosMode : false;
            PvPStatics.RoundDuration = data != null ? data.RoundDuration : 5000;

            TurnTimesStatics.ActiveConfiguration = data != null && TurnTimesStatics.IsValidConfiguration(data.TurnTimeConfiguration) ? data.TurnTimeConfiguration : TurnTimesStatics.FiveMinuteTurns;

            PvPStatics.AlphaRound = DomainRegistry.Repository.FindSingle(new GetWorld()).RoundNumber ?? PvPStatics.AlphaRound;

            if (data != null)
            {
                JokeShopProcedures.SetJokeShopActive(data.JokeShop);
            }
        }
예제 #7
0
        public static void BuildWithContainer(IAppBuilder app, Container container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }

            if (Settings.Current.ShouldAutoUpgradeDatabase)
            {
                MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, Settings.Current.MongoDatabaseName);
            }

            Config = new HttpConfiguration();
            Config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
            Config.Formatters.Remove(Config.Formatters.XmlFormatter);
            Config.Formatters.JsonFormatter.SerializerSettings.Formatting       = Formatting.Indented;
            Config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = container.GetInstance <IContractResolver>();

            var constraintResolver = new DefaultInlineConstraintResolver();

            constraintResolver.ConstraintMap.Add("objectid", typeof(ObjectIdRouteConstraint));
            constraintResolver.ConstraintMap.Add("objectids", typeof(ObjectIdsRouteConstraint));
            constraintResolver.ConstraintMap.Add("token", typeof(TokenRouteConstraint));
            constraintResolver.ConstraintMap.Add("tokens", typeof(TokensRouteConstraint));
            Config.MapHttpAttributeRoutes(constraintResolver);

            container.RegisterWebApiFilterProvider(Config);

            VerifyContainer(container);

            container.Bootstrap(Config);
            container.Bootstrap(app);
            Log.Info().Message("Starting api...").Write();

            Config.Services.Add(typeof(IExceptionLogger), new NLogExceptionLogger());
            Config.Services.Replace(typeof(IExceptionHandler), container.GetInstance <ExceptionlessReferenceIdExceptionHandler>());

            Config.MessageHandlers.Add(container.GetInstance <XHttpMethodOverrideDelegatingHandler>());
            Config.MessageHandlers.Add(container.GetInstance <EncodingDelegatingHandler>());
            Config.MessageHandlers.Add(container.GetInstance <AuthMessageHandler>());

            // Throttle api calls to X every 15 minutes by IP address.
            Config.MessageHandlers.Add(container.GetInstance <ThrottlingHandler>());

            // Reject event posts in orgs over their max event limits.
            Config.MessageHandlers.Add(container.GetInstance <OverageHandler>());

            app.UseCors(new CorsOptions {
                PolicyProvider = new CorsPolicyProvider
                {
                    PolicyResolver = ctx => Task.FromResult(new CorsPolicy
                    {
                        AllowAnyHeader      = true,
                        AllowAnyMethod      = true,
                        AllowAnyOrigin      = true,
                        SupportsCredentials = true,
                        PreflightMaxAge     = 60 * 5
                    })
                }
            });

            app.CreatePerContext <Lazy <User> >("User", ctx => new Lazy <User>(() => {
                if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated)
                {
                    return(null);
                }

                string userId = ctx.Request.User.GetUserId();
                if (String.IsNullOrEmpty(userId))
                {
                    return(null);
                }

                var userRepository = container.GetInstance <IUserRepository>();
                return(userRepository.GetById(userId, true));
            }));

            app.CreatePerContext <Lazy <Project> >("DefaultProject", ctx => new Lazy <Project>(() => {
                if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated)
                {
                    return(null);
                }

                // TODO: Use project id from url. E.G., /projects/{projectId:objectid}/events
                string projectId      = ctx.Request.User.GetDefaultProjectId();
                var projectRepository = container.GetInstance <IProjectRepository>();

                if (String.IsNullOrEmpty(projectId))
                {
                    var firstOrgId = ctx.Request.User.GetOrganizationIds().FirstOrDefault();
                    if (!String.IsNullOrEmpty(firstOrgId))
                    {
                        var project = projectRepository.GetByOrganizationId(firstOrgId, useCache: true).FirstOrDefault();
                        if (project != null)
                        {
                            return(project);
                        }
                    }

                    if (Settings.Current.WebsiteMode == WebsiteMode.Dev)
                    {
                        var dataHelper = container.GetInstance <DataHelper>();
                        // create a default org and project
                        projectId = dataHelper.CreateDefaultOrganizationAndProject(ctx.Request.GetUser());
                    }
                }

                if (String.IsNullOrEmpty(projectId))
                {
                    return(null);
                }

                return(projectRepository.GetById(projectId, true));
            }));

            app.UseWebApi(Config);
            var resolver = new SimpleInjectorSignalRDependencyResolver(container);

            if (Settings.Current.EnableRedis)
            {
                resolver.UseRedis(new RedisScaleoutConfiguration(Settings.Current.RedisConnectionString, "exceptionless.signalr"));
            }
            app.MapSignalR("/api/v2/push", new HubConfiguration {
                Resolver = resolver
            });

            Config.EnableSwagger("schema/{apiVersion}", c => {
                c.SingleApiVersion("v2", "Exceptionless");
                c.ApiKey("access_token").In("header").Name("access_token").Description("API Key Authentication");
                c.BasicAuth("basic").Description("Basic HTTP Authentication");
                c.IncludeXmlComments(String.Format(@"{0}\bin\Exceptionless.Api.xml", AppDomain.CurrentDomain.BaseDirectory));
                c.IgnoreObsoleteActions();
                c.DocumentFilter <FilterRoutesDocumentFilter>();
            }).EnableSwaggerUi("docs/{*assetPath}", c => {
                c.InjectStylesheet(typeof(AppBuilder).Assembly, "Exceptionless.Api.Content.docs.css");
                c.InjectJavaScript(typeof(AppBuilder).Assembly, "Exceptionless.Api.Content.docs.js");
            });

            Mapper.Configuration.ConstructServicesUsing(container.GetInstance);

            var context = new OwinContext(app.Properties);
            var token   = context.Get <CancellationToken>("host.OnAppDisposing");

            CreateSampleData(container);

            if (Settings.Current.RunJobsInProcess)
            {
                Task.Factory.StartNew(() => container.GetInstance <EventPostsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <EventUserDescriptionsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <MailMessageJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <EventNotificationsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <WebHooksJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<DailySummaryJob>().RunContinuousAsync(delay: TimeSpan.FromMinutes(15), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<RetentionLimitsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<StaleAccountsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
            }
        }
예제 #8
0
        public void Configuration(IAppBuilder app)
        {
            //Repository to consider
            const string DB_REPOSITORY_NAMESPACE = "TodoApp.Infrastructure.InMemory.Repositories";

            //DI container
            var container = new Container();

            //Registering all controllers
            container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

            //Getting Application assembly
            var applicationAssembly = typeof(TodoApp.Application.ApplicationException).Assembly;

            //Registering Application interfaces
            var registrations =
                from type in applicationAssembly.GetExportedTypes()
                where type.GetInterfaces().Any() && !type.Name.Contains("Exception")
                select new { Service = type.GetInterfaces().Single(), Implementation = type };

            foreach (var reg in registrations)
            {
                container.Register(reg.Service, reg.Implementation, Lifestyle.Transient);
            }

            //Getting Repository assembly
            var repositoryAssembly = typeof(TodoApp.Infrastructure.ReferenceType).Assembly;

            //Registering Repository interfaces
            registrations =
                from type in repositoryAssembly.GetExportedTypes()
                where type.Namespace == DB_REPOSITORY_NAMESPACE
                where type.GetInterfaces().Any()
                select new { Service = type.GetInterfaces().Single(), Implementation = type };

            foreach (var reg in registrations)
            {
                container.Register(reg.Service, reg.Implementation, Lifestyle.Transient);
            }

            //Registeging InMemoryDB
            container.Register(() => new TodoApp.Infrastructure.InMemory.Context(), Lifestyle.Singleton);

            app.Use(async(context, next) =>
            {
                using (AsyncScopedLifestyle.BeginScope(container))
                {
                    await next();
                }
            });

            GlobalConfiguration.Configuration.DependencyResolver =
                new SimpleInjectorWebApiDependencyResolver(container);

            //Registering SignalR socket service
            var signalRResolver = new SimpleInjectorSignalRDependencyResolver(container);

            IJokeFetcher jokeFetcher = new JokeFetcher();

            container.Register(() => new TodoAppHub(jokeFetcher), Lifestyle.Singleton);

            app.Map("/r", map =>
            {
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration
                {
                    Resolver = signalRResolver
                };
                map.RunSignalR(hubConfiguration);
            });

            GlobalHost.DependencyResolver = signalRResolver;

            //Configuring cors
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        }