// 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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
    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));
    }