// Note, basic store functionality tested in MultiTenantStoresShould.cs private IMultiTenantStore CreateCaseSensitiveTestStore() { var store = new MultiTenantStoreWrapper <InMemoryStore>(new InMemoryStore(false), null); store.TryAddAsync(new TenantInfo("initech", "initech", "Initech", null, null)).Wait(); store.TryAddAsync(new TenantInfo("lol", "lol", "Lol, Inc.", null, null)).Wait(); return(store); }
public async Task <IMultiTenantContext <T>?> ResolveAsync(object context) { IMultiTenantContext <T>?result = null; foreach (var strategy in Strategies) { var _strategy = new MultiTenantStrategyWrapper(strategy, loggerFactory?.CreateLogger(strategy.GetType()) ?? NullLogger.Instance); var identifier = await _strategy.GetIdentifierAsync(context); if (options.CurrentValue.IgnoredIdentifiers.Contains(identifier, StringComparer.OrdinalIgnoreCase)) { (loggerFactory?.CreateLogger(GetType()) ?? NullLogger.Instance).LogInformation("Ignored identifier: {Identifier}", identifier); identifier = null; } if (identifier != null) { foreach (var store in Stores) { var _store = new MultiTenantStoreWrapper <T>(store, loggerFactory?.CreateLogger(store.GetType()) ?? NullLogger.Instance); var tenantInfo = await _store.TryGetByIdentifierAsync(identifier); if (tenantInfo != null) { result = new MultiTenantContext <T>(); result.StoreInfo = new StoreInfo <T> { Store = store, StoreType = store.GetType() }; result.StrategyInfo = new StrategyInfo { Strategy = strategy, StrategyType = strategy.GetType() }; result.TenantInfo = tenantInfo; await options.CurrentValue.Events.OnTenantResolved(new TenantResolvedContext { Context = context, TenantInfo = tenantInfo, StrategyType = strategy.GetType(), StoreType = store.GetType() }); break; } } if (result != null) { break; } await options.CurrentValue.Events.OnTenantNotResolved(new TenantNotResolvedContext { Context = context, Identifier = identifier }); } } return(result); }
/// <summary> /// Creates an InMemoryStore from configured InMemoryMultiTenantStoreOptions. /// </summary> private IMultiTenantStore InMemoryStoreFactory(Action <InMemoryStoreOptions> config, bool ignoreCase, ILogger <MultiTenantStoreWrapper <InMemoryStore> > logger) { if (config == null) { throw new ArgumentNullException(nameof(config)); } var options = new InMemoryStoreOptions(); config(options); var store = new MultiTenantStoreWrapper <InMemoryStore>(new InMemoryStore(ignoreCase), logger); try { foreach (var tenantConfig in options.TenantConfigurations ?? new InMemoryStoreOptions.TenantConfiguration[0]) { if (string.IsNullOrWhiteSpace(tenantConfig.Id) || string.IsNullOrWhiteSpace(tenantConfig.Identifier)) { throw new MultiTenantException("Tenant Id and Identifer cannot be null or whitespace."); } var tenantInfo = new TenantInfo(tenantConfig.Id, tenantConfig.Identifier, tenantConfig.Name, tenantConfig.ConnectionString ?? options.DefaultConnectionString, null); foreach (var item in tenantConfig.Items ?? new Dictionary <string, string>()) { tenantInfo.Items.Add(item.Key, item.Value); } if (!store.TryAddAsync(tenantInfo).Result) { throw new MultiTenantException($"Unable to add {tenantInfo.Identifier} is already configured."); } } } catch (Exception e) { throw new MultiTenantException ("Unable to add tenant to store.", e); } return(store); }
public async Task <IMultiTenantContext <T> > ResolveAsync(object context) { IMultiTenantContext <T> result = null; foreach (var strategy in Strategies) { var _strategy = new MultiTenantStrategyWrapper(strategy, loggerFactory?.CreateLogger(strategy.GetType())); var identifier = await _strategy.GetIdentifierAsync(context); if (options.CurrentValue.IgnoredIdentifiers.Contains(identifier)) { Utilities.TryLoginfo(loggerFactory?.CreateLogger(GetType()), $"Ignored identifier: {identifier}"); identifier = null; } if (identifier != null) { foreach (var store in Stores) { var _store = new MultiTenantStoreWrapper <T>(store, loggerFactory?.CreateLogger(store.GetType())); var tenantInfo = await _store.TryGetByIdentifierAsync(identifier); if (tenantInfo != null) { result = new MultiTenantContext <T>(); result.StoreInfo = new StoreInfo <T> { Store = store, StoreType = store.GetType() }; result.StrategyInfo = new StrategyInfo { Strategy = strategy, StrategyType = strategy.GetType() }; result.TenantInfo = tenantInfo; break; } } if (result != null) { break; } } } return(result); }
protected override IMultiTenantStore CreateTestStore() { var connection = new SqliteConnection("DataSource=:memory:"); connection.Open(); var options = new DbContextOptionsBuilder() .UseSqlite(connection) .Options; var dbContext = new TestEFCoreStoreDbContext(options); dbContext.Database.EnsureCreated(); var store = new MultiTenantStoreWrapper <EFCoreStore <TestEFCoreStoreDbContext, TestTenantInfoEntity> > (new EFCoreStore <TestEFCoreStoreDbContext, TestTenantInfoEntity>(dbContext), null); return(PopulateTestStore(store)); }
protected override IMultiTenantStore CreateTestStore() { var store = new MultiTenantStoreWrapper <InMemoryStore>(new InMemoryStore(), null); return(PopulateTestStore(store)); }
// Basic store functionality tested in MultiTenantStoresShould.cs protected override IMultiTenantStore <TenantInfo> CreateTestStore() { var store = new MultiTenantStoreWrapper <TenantInfo>(new InMemoryStore <TenantInfo>(null), NullLogger.Instance); return(PopulateTestStore(store)); }