コード例 #1
0
 public AccountController(ModuleZeroSampleProjectUserManager userManager, IRepository <User, long> userRepository, IRepository <Tenant> tenantRepository, MultiTenancyConfig multiTenancy)
 {
     _userManager      = userManager;
     _userRepository   = userRepository;
     _tenantRepository = tenantRepository;
     _multiTenancy     = multiTenancy;
 }
コード例 #2
0
        public static MultiTenancyConfig <TTenant> Use <TTenant, T>(this MultiTenancyConfig <TTenant> configuration, T entry, Action <T> entryAction)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            entryAction?.Invoke(entry);
            return(configuration);
        }
コード例 #3
0
        /// <summary>
        /// Add MultitenanCy Options.
        /// </summary>
        /// <param name="services">An IServiceCollection.</param>
        /// <param name="multitenancyConfig">The object which containd multitenant config.</param>
        /// <returns>IServiceCollection.</returns>
        /// <typeparam name="TTenant">Tenant object.</typeparam>
        internal static IServiceCollection AddMultitenancyOptions <TTenant>(this IServiceCollection services, MultiTenancyConfig <TTenant> multitenancyConfig)
        {
            if (services == null)
            {
                throw new ArgumentNullException($"Argument {nameof(services)} must not be null");
            }

            if (multitenancyConfig == null)
            {
                throw new ArgumentNullException($"Argument {nameof(multitenancyConfig)} must not be null");
            }

            services.Configure <MultitenancyOptions <TTenant> >(multitenancyConfig.Config.GetSection(nameof(MultitenancyConstants.MultitenancyOptions)));
            services.AddSingleton <IPostConfigureOptions <MultitenancyOptions <TTenant> >, MultitenancyPostConfigureOptions <TTenant> >();
            services.AddSingleton(sp => sp.GetService <IOptionsMonitor <MultitenancyOptions <TTenant> > >().CurrentValue);

            services.AddSingleton <IMultitenancyOptionsProvider <TTenant> >(sp => new MultitenancyOptionsProvider <TTenant>(multitenancyConfig));

            return(services);
        }
コード例 #4
0
 private static ServiceDescriptor BuildConventionMultitenantBasedStartup <TTenant>(Type startupType, MultiTenancyConfig <TTenant> multitenancyConfig)
     where TTenant : class => new ServiceDescriptor(
     typeof(IStartup),
     (IServiceProvider provider) =>
 {
     IHostingEnvironment hostingEnvironment      = provider.GetRequiredService <IHostingEnvironment>();
     StartupMethodsMultitenant <TTenant> methods = StartupLoaderMultitenant.LoadMethods <TTenant>(provider, startupType, hostingEnvironment.EnvironmentName);
     return(new ConventionMultitenantBasedStartup <TTenant>(methods, multitenancyConfig.BuildTenantLogProvider()));
 }, lifetime: ServiceLifetime.Singleton);
コード例 #5
0
        /// <summary>
        /// Add multitenancy feature.
        /// </summary>
        /// <typeparam name="TStartup">The stratup class.</typeparam>
        /// <typeparam name="TTenant">The tenant class.</typeparam>
        /// <typeparam name="TResolver">The Resolver tenant.</typeparam>
        /// <param name="hostBuilder">hostBuilder.</param>
        /// <param name="startupType">The type of the startup class.</param>
        /// <param name="multitenancyConfiguration">The configuration which contains MultitenancyOptions.</param>
        /// <param name="throwErrorIfOptionsNotFound">Boolean to indicate if throws exception when MultitenancyOptions is not found.</param>
        /// <param name="actionConfiguration">Additionnal config.</param>
        /// <returns>IWebHostBuilder.</returns>
        internal static IWebHostBuilder UseUnobtrusiveMulitenancyStartup <TStartup, TTenant, TResolver>(
            this IWebHostBuilder hostBuilder,
            Type startupType,
            IConfigurationRoot multitenancyConfiguration,
            bool throwErrorIfOptionsNotFound,
            Action <MultiTenancyConfig <TTenant> > actionConfiguration)
            where TStartup : class
            where TTenant : class
            where TResolver : class, ITenantResolver <TTenant>
        {
            if (hostBuilder == null)
            {
                throw new ArgumentNullException(nameof(hostBuilder));
            }

            string env = hostBuilder.GetSetting("environment");

            IPostConfigureOptions <MultitenancyOptions <TTenant> >[] postConfigures = new[] {
                new MultitenancyPostConfigureOptions <TTenant>()
            };
            MultiTenancyConfig <TTenant> multitenancyConfig = new MultiTenancyConfig <TTenant>(
                env,
                multitenancyConfiguration,
                postConfigures: postConfigures);
            MultitenancyOptions <TTenant> buildedOptions = multitenancyConfig.CurrentMultiTenacyOptionsValue;

            if (throwErrorIfOptionsNotFound && (buildedOptions == null || !(buildedOptions?.Tenants?.Any() ?? false)))
            {
                throw new Exception("MultitenancyOptions not found in configuration.");
            }

            if (!(buildedOptions?.Tenants?.Any() ?? false))
            {
                return(hostBuilder.UseStartup <TStartup>());
            }
            else
            {
                string startupAssemblyName = startupType.GetTypeInfo().Assembly.GetName().Name;

                return(hostBuilder
                       .UseDefaultServiceProvider(options => options.ValidateScopes = false)
                       .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    hostBuilder.UseSetting(WebHostDefaults.ApplicationKey, startupAssemblyName);
                    hostBuilder.UseSetting(MultitenancyConstants.UseUnobstrusiveMulitenancyStartupKey, startupAssemblyName);
                    hostBuilder.UseSetting(WebHostDefaults.StartupAssemblyKey, null);
                })
                       .ConfigureServices((WebHostBuilderContext ctx, IServiceCollection services) =>
                {
                    services.TryAddSingleton <IHttpContextAccessor, HttpContextAccessor>();
                    //services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

                    // Register multitenancy options.
                    services.AddMultitenancyOptions <TTenant>(multitenancyConfig);
                    services.AddMultitenancy <TTenant, TResolver>();

                    // manage IStartup
                    services.RemoveAll <IStartup>();

                    // Override config.
                    // Add logging
                    multitenancyConfig.UseColoredConsoleLogProvider();
                    actionConfiguration?.Invoke(multitenancyConfig);
                    services.TryAdd(ServiceDescriptor.Singleton <ILogProvider>(LogProvider.CurrentLogProvider));
                    services.TryAdd(ServiceDescriptor.Singleton(typeof(ILog <>), typeof(Log <>)));
                    services.AddSingleton <MultiTenancyConfig <TTenant> >(serviceProvider => multitenancyConfig);

                    ServiceDescriptor descriptor = BuildMultitenantRequestStartupFilter <TStartup, TTenant>();
                    services.Insert(0, descriptor);

                    ServiceDescriptor startuptDescriptor = BuildConventionMultitenantBasedStartup(startupType, multitenancyConfig);
                    services.Insert(1, startuptDescriptor);
                })
                       );
            }
        }
コード例 #6
0
 public AbpSession(MultiTenancyConfig multiTenancy)
 {
     _multiTenancy = multiTenancy;
 }
コード例 #7
0
 public void ConfigurePerTenantServices(IServiceCollection services, MultiTenancyConfig <TestTenant> config)
 {
 }
コード例 #8
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="multiTenancy">Multi tenancy configuration</param>
 public ZeroConfig(MultiTenancyConfig multiTenancy)
 {
     MultiTenancy = multiTenancy;
 }
コード例 #9
0
 /// <summary>
 /// Add additionnal ConfigureServices for specific tenant.
 /// </summary>
 /// <typeparam name="TTenant"></typeparam>
 /// <param name="configuration">Object represents MultiTenancyConfig.</param>
 /// <param name="action">Action to configure services.</param>
 /// <returns></returns>
 public static MultiTenancyConfig <TTenant> UseConfigureServicesTenant <TTenant>(
     this MultiTenancyConfig <TTenant> configuration, Action <IServiceCollection, TTenant> action)
 {
     return(configuration.Use(action, x => configuration.SetConfigureServicesTenant(action)));
 }
コード例 #10
0
 /// <summary>
 ///
 /// </summary>
 /// <typeparam name="TTenant"></typeparam>
 /// <param name="configuration"></param>
 /// <param name="func"></param>
 /// <returns></returns>
 public static MultiTenancyConfig <TTenant> UseCustomServicesTenant <TTenant>(
     this MultiTenancyConfig <TTenant> configuration, Func <IServiceCollection, TTenant, IConfiguration, ILogProvider> func)
 {
     configuration.SetTenantLogProvider(func);
     return(configuration);
 }
コード例 #11
0
 /// <summary>
 ///
 /// </summary>
 /// <typeparam name="TTenant"></typeparam>
 /// <typeparam name="TLogProvider"></typeparam>
 /// <param name="configuration"></param>
 /// <param name="tenant"></param>
 /// <param name="tenantConfiguration"></param>
 /// <param name="provider"></param>
 /// <returns></returns>
 public static MultiTenancyConfig <TTenant> UseLogCustomServicesTenant <TTenant, TLogProvider>(
     this MultiTenancyConfig <TTenant> configuration, TTenant tenant, IConfiguration tenantConfiguration, TLogProvider provider)
     where TLogProvider : ILogProvider
 {
     return(configuration.Use(provider, x => LogProvider.SetCurrentLogProvider(x)));
 }
コード例 #12
0
 /// <summary>
 /// Add serilo ProviderLog.
 /// </summary>
 /// <param name="configuration"></param>
 /// <returns></returns>
 internal static MultiTenancyConfig <TTenant> UseSerilogLogProvider <TTenant>(this MultiTenancyConfig <TTenant> configuration)
 {
     return(configuration.UseLogProvider(new SerilogLogProvider()));
 }
コード例 #13
0
 /// <summary>
 /// Activate ConsoleLog.
 /// </summary>
 /// <typeparam name="TTenant"></typeparam>
 /// <param name="configuration"></param>
 /// <returns></returns>
 internal static MultiTenancyConfig <TTenant> UseColoredConsoleLogProvider <TTenant>(this MultiTenancyConfig <TTenant> configuration)
 {
     return(configuration.UseLogProvider(new ColoredConsoleLogProvider()));
 }