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()); }
/// <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); } }
/// <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); } }
// 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")); }
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()); }