예제 #1
0
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            var container = new Container();

            var mixed = Lifestyle.CreateHybrid(new AsyncScopedLifestyle(), new ThreadScopedLifestyle());
            var style = Lifestyle.CreateHybrid(new WebRequestLifestyle(), mixed);

            container.Options.DefaultScopedLifestyle = style;

            container.Register <IDbContextInfoProvider, DbContextInfoProvider>(Lifestyle.Scoped);
            container.Register <IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);
            container.Register <IClientService, ClientService>(Lifestyle.Scoped);

            container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

            container.Verify();
            DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

            InitialiseShardMapManager();
            ShardHelper.RegisterAllTenantShard(DatabaseConfigHelper.GetServerNameFull());
        }
예제 #2
0
        /// <summary>
        ///
        /// </summary>
        private void InitializeContext()
        {
            if (this.context == null)
            {
                // tenantId base on the name
                var tenantId = ShardHelper.GetTenantKey(this.contextInfoProvider.GetTenantName());

                // database parameters
                var basicConnectionString  = this.contextInfoProvider.GetBasicSqlConnectionString();
                var databaseServerPassword = this.contextInfoProvider.GetDatabaseServerPassword();

                this.context = new TenantDbContext(Sharding.ShardMap, tenantId, basicConnectionString, databaseServerPassword);
            }
        }
예제 #3
0
        /// <summary>
        /// Registers the new shard.
        /// Verify if shard exists for the tenant. If not then create new shard and add tenant details to Tenants table in catalog
        /// </summary>
        /// <param name="tenantName">Name of the tenant.</param>
        /// <param name="tenantId">The tenant identifier.</param>
        /// <param name="tenantServer">The tenant server.</param>
        /// <returns></returns>
        public static bool RegisterNewShard(int tenantId, string tenantName, string tenantServer, bool needToSaveOnDB = false)
        {
            try
            {
                ShardLocation shardLocation = new ShardLocation(tenantServer, tenantName);

                if (!ShardMap.TryGetShard(shardLocation, out Shard shard))
                {
                    //create shard if it does not exist
                    shard = ShardMap.CreateShard(shardLocation);
                }

                // Register the mapping of the tenant to the shard in the shard map.
                // After this step, DDR on the shard map can be used
                if (!ShardMap.TryGetMappingForKey(tenantId, out PointMapping <int> mapping))
                {
                    var pointMapping = ShardMap.CreatePointMapping(tenantId, shard);

                    if (needToSaveOnDB)
                    {
                        //convert from int to byte[] as tenantId has been set as byte[] in Tenants entity
                        var key = ShardHelper.ConvertIntKeyToBytesArray(pointMapping.Value);

                        //add tenant to Tenants table
                        var tenant = new Tenants
                        {
                            TenantId    = key,
                            TenantName  = tenantName,
                            LastUpdated = DateTime.Now
                        };

                        var db = new CatalogDbContext();
                        db.Tenants.Add(tenant);
                        db.SaveChanges();
                    }
                }

                return(true);
            }
            catch (Exception exception)
            {
                Trace.TraceError(exception.Message, "Error in registering new shard.");
                return(false);
            }
        }
예제 #4
0
        // DELETE: Tenant
        public ActionResult Delete(string tenantName)
        {
            HttpContext.Server.ScriptTimeout = 600;

            tenantName = tenantName.ToLower();

            var db     = new CatalogDbContext();
            var tenant = db.Tenants.FirstOrDefault(t => t.TenantName == tenantName);

            if (tenant != null)
            {
                ShardHelper.DeleteTenantShard(DatabaseConfigHelper.GetServerNameFull(), tenantName);
                DeleteDb(tenantName);

                db.Tenants.Remove(tenant);
                db.SaveChanges();
            }

            return(RedirectToAction("List"));
        }
예제 #5
0
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                HttpContext.Server.ScriptTimeout = 600;

                var tenantName = collection.Get("tenantName");
                if (string.IsNullOrEmpty(tenantName))
                {
                    ViewBag.ErrorMsg = "Tenant name is invalid";
                    return(View());
                }

                tenantName = tenantName.ToLower();

#if DEBUG
                if (!tenantName.ToLower().StartsWith("dev-"))
                {
                    ViewBag.ErrorMsg = "Tenant name need to start with dev-";
                    return(View());
                }
#endif

                var db     = new CatalogDbContext();
                var tenant = db.Tenants.FirstOrDefault(t => t.TenantName == tenantName);
                if (tenant == null)
                {
                    CopyDbTemplate(tenantName);
                    ShardHelper.RegisterTenantShard(DatabaseConfigHelper.GetServerNameFull(), tenantName);
                }

                return(RedirectToAction("List"));
            }
            catch (Exception ex)
            {
                ViewBag.ErrorMsg = ex.Message;
                return(View());
            }
        }
        public ActionResult Cast(int captain)
        {
            var shardMap     = ShardHelper.CreateOrGetRangeShardMap();
            var shardMapping = shardMap.GetMappingForKey(captain);

            var container = UnityConfig.GetConfiguredContainer();

            var voteContext = container.Resolve <VoteContext>(shardMapping.Shard.ToString(),
                                                              new ParameterOverride("server", shardMapping.Shard.Location.DataSource),
                                                              new ParameterOverride("database", shardMapping.Shard.Location.Database));

            voteContext.Votes.Add(new Vote()
            {
                Captain = captain,
                Placed  = DateTime.UtcNow
            });
            voteContext.SaveChanges();

            ViewBag.CaptainID = captain;

            return(View());
        }