/// <inheritdoc /> public TContext Create() { var value = _tenantProvider.Get().ToString(); if (string.IsNullOrEmpty(value)) { throw new TenantNotProvidedException(); } var tenant = _tenantManager.Get(_tenantProvider.Get()); if (tenant is null) { throw new TenantNotFoundException(_tenantProvider.Get().ToString()); } var password = _tenantManager.GetTenantPassword(tenant.Password, tenant.ConcurrencyStamp); var connectionStringBuilder = new SqlConnectionStringBuilder { DataSource = $"tcp:{tenant.Server},{tenant.Port}", InitialCatalog = tenant.Database, UserID = tenant.UserName, Password = password, }; _context = Activator.CreateInstance(typeof(TContext), connectionStringBuilder, _tenantProvider, _onConfiguringDbContextOptionsBuilderProvider) as TContext; return(_context); }
public Task <ITenant> GetTenantAsync() { var request = _httpContextAccessor.HttpContext.Request; if (!request.Headers.ContainsKey(_tenantIdHeaderKey)) { throw new InvalidOperationException("Missing tenant id"); } var tenantHeaderValue = request.Headers[_tenantIdHeaderKey].FirstOrDefault(); if (!int.TryParse(tenantHeaderValue, out int tenantId)) { throw new InvalidOperationException($"Invalid tenant id: {tenantHeaderValue}"); } return(Task.FromResult(_tenantProvider.Get(tenantId))); }