public static Lazy <RequestDelegate> GetOrAddMiddlewarePipeline <TTenant>(this TenantShell <TTenant> tenantShell, Lazy <RequestDelegate> requestDelegateFactory)
            where TTenant : class
        {
            var result = tenantShell.Properties.GetOrAdd(nameof(TenantShellPipelineExtensions), requestDelegateFactory) as Lazy <RequestDelegate>;

            return(result);
        }
        public static Lazy <ICabinet> GetOrAddTenantWebRootFileSystem <TTenant>(this TenantShell <TTenant> tenantShell, Lazy <ICabinet> factory)
            where TTenant : class
        {
            var result = tenantShell.Properties.GetOrAdd(WebRootKey, factory) as Lazy <ICabinet>;

            return(result);
        }
Exemplo n.º 3
0
        private Task <TenantShell <Tenant> > CreateGicrosoftTenant()
        {
            Guid tenantId = Guid.Parse("b17fcd22-0db1-47c0-9fef-1aa1cb09605e");
            var  tenant   = new Tenant(tenantId, "Gicrosoft");
            var  result   = new TenantShell <Tenant>(tenant);

            return(Task.FromResult(result));
        }
Exemplo n.º 4
0
        private Task <TenantShell <Tenant> > CreateMoogleTenant()
        {
            Guid tenantId = Guid.Parse("049c8cc4-3660-41c7-92f0-85430452be22");
            var  tenant   = new Tenant(tenantId, "Moogle");
            // Also adding any additional Uri's that should be mapped to this same tenant.
            var result = new TenantShell <Tenant>(tenant, new Uri("http://localhost:5000"),
                                                  new Uri("http://localhost:5001"));

            return(Task.FromResult(result));
        }
        public static Lazy <Task <AppFunc> > GetOrAddMiddlewarePipeline <TTenant>(this TenantShell <TTenant> tenantShell, Lazy <Task <AppFunc> > requestDelegateFactory)
            where TTenant : class
        {
            var property = tenantShell.GetOrAddProperty(nameof(TenantShellPipelineExtensions), requestDelegateFactory);

            tenantShell.RegisterCallbackOnDispose(() =>
            {
                if (requestDelegateFactory.IsValueCreated)
                {
                    requestDelegateFactory.Value?.Dispose();
                }
            });
            return(property);
        }
Exemplo n.º 6
0
        public async Task DisplayInfo(HttpContext context)
        {
            ILogger <Startup> logger = context.RequestServices.GetRequiredService <ILogger <Startup> >();

            logger.LogDebug("App Run..");

            ITenantContainerAdaptor container = context.RequestServices as ITenantContainerAdaptor;

            logger.LogDebug("App Run Container Is: {id}, {containerNAme}, {role}", container.ContainerId, container.ContainerName, container.Role);


            // Use ITenantAccessor to access the current tenant.
            ITenantAccessor <Tenant> tenantAccessor = container.GetRequiredService <ITenantAccessor <Tenant> >();
            Tenant tenant = await tenantAccessor.CurrentTenant.Value;

            // This service was registered as singleton in tenant container.
            SomeTenantService someTenantService = container.GetService <SomeTenantService>();

            // The tenant shell to access context for the tenant - even if the tenant is null
            ITenantShellAccessor <Tenant> tenantShellAccessor = context.RequestServices.GetRequiredService <ITenantShellAccessor <Tenant> >();
            TenantShell <Tenant>          tenantShell         = await tenantShellAccessor.CurrentTenantShell.Value;

            var myOptions = context.RequestServices.GetRequiredService <IOptions <MyOptions> >();

            string tenantShellId      = tenantShell == null ? "{NULL TENANT SHELL}" : tenantShell.Id.ToString();
            string tenantName         = tenant == null ? "{NULL TENANT}" : tenant.Name;
            string injectedTenantName = someTenantService?.TenantName ?? "{NULL SERVICE}";

            // Accessing a content file.
            string fileContent = someTenantService?.GetContentFile("/Info.txt");

            context.Response.ContentType = new MediaTypeHeaderValue("application/json").ToString();
            var result = new
            {
                TenantShellId         = tenantShellId,
                TenantName            = tenantName,
                TenantScopedServiceId = someTenantService?.Id,
                InjectedTenantName    = injectedTenantName,
                TenantContentFile     = fileContent,
                OptionsFoo            = myOptions.Value.Foo
            };

            string jsonResult = JsonConvert.SerializeObject(result);
            await context.Response.WriteAsync(jsonResult, Encoding.UTF8);

            logger.LogDebug("App Run Finished..");
        }
        public Task <TenantShell <Tenant> > Get(TenantIdentifier distinguisher)
        {
            if (distinguisher.Uri.Port == 5004)
            {
                Guid tenantId = Guid.Parse("b17fcd22-0db1-47c0-9fef-1aa1cb09605e");
                var  tenant   = new Tenant(tenantId)
                {
                    Name = "Foo"
                };
                var result = new TenantShell <Tenant>(tenant);
                return(Task.FromResult(result));
            }

            if (distinguisher.Uri.Port == 5000 || distinguisher.Uri.Port == 5001)
            {
                Guid tenantId = Guid.Parse("049c8cc4-3660-41c7-92f0-85430452be22");
                var  tenant   = new Tenant(tenantId)
                {
                    Name = "Bar"
                };
                var result = new TenantShell <Tenant>(tenant, new Uri("http://localhost:5000"), new Uri("http://localhost:5001")); // additional distinguishers to map this same tenant shell instance too.
                return(Task.FromResult(result));
            }

            // for an unknown tenant, we can either create the tenant shell as a NULL tenant by returning a TenantShell<TTenant>(null),
            // which results in the TenantShell being created, and will explicitly have to be reloaded() in order for this method to be called again.
            if (distinguisher.Uri.Port == 5002)
            {
                var result = new TenantShell <Tenant>(null);
                return(Task.FromResult(result));
            }

            if (distinguisher.Uri.Port == 5003)
            {
                // or we can return null - which means we wil keep attempting to resolve the tenant on every subsequent request until a result is returned in future.
                // (i.e allows tenant to be created in backend in a few moments time).
                return(Task.FromResult <TenantShell <Tenant> >(null));;
            }

            throw new NotImplementedException("Please make request on ports 5000 - 5003 to see various behaviour. Can also use 63291 when launching under IISExpress");
        }
Exemplo n.º 8
0
        public Task <TenantShell <Tenant> > Get(TenantIdentifier distinguisher)
        {
            if (distinguisher.Uri.Port == 5000 || distinguisher.Uri.Port == 5001)
            {
                Guid tenantId = Guid.Parse("049c8cc4-3660-41c7-92f0-85430452be22");
                var  tenant   = new Tenant(tenantId, "Moogle");
                // Also adding any additional Uri's that should be mapped to this same tenant.
                var result = new TenantShell <Tenant>(tenant, new Uri("http://localhost:5000"),
                                                      new Uri("http://localhost:5001"));
                return(Task.FromResult(result));
            }

            if (distinguisher.Uri.Port == 5002)
            {
                Guid tenantId = Guid.Parse("b17fcd22-0db1-47c0-9fef-1aa1cb09605e");
                var  tenant   = new Tenant(tenantId, "Gicrosoft");
                var  result   = new TenantShell <Tenant>(tenant);
                return(Task.FromResult(result));
            }


            throw new NotImplementedException("Please make request on ports 5000 - 5003 to see various behaviour.");
        }
Exemplo n.º 9
0
 public static Lazy <ICabinet> GetOrAddTenantFileSystem <TTenant>(this TenantShell <TTenant> tenantShell, string key, Lazy <ICabinet> factory)
     where TTenant : class
 {
     return(tenantShell.GetOrAddProperty(key, factory) as Lazy <ICabinet>);
 }
Exemplo n.º 10
0
 public static Lazy <ICabinet> TryGetTenantFileSystem <TTenant>(this TenantShell <TTenant> tenantShell, string key)
     where TTenant : class
 {
     tenantShell.TryGetProperty(key, out Lazy <ICabinet> result);
     return(result);
 }
 public static Lazy <ICabinet> GetOrAddTenantWebRootFileSystem <TTenant>(this TenantShell <TTenant> tenantShell, Lazy <ICabinet> factory)
     where TTenant : class
 {
     return(tenantShell.GetOrAddTenantFileSystem(WebRootKey, factory) as Lazy <ICabinet>);
 }
 public static Lazy <ICabinet> TryGetWebRootFileSystem <TTenant>(this TenantShell <TTenant> tenantShell)
     where TTenant : class
 {
     return(tenantShell.TryGetTenantFileSystem(WebRootKey) as Lazy <ICabinet>);
 }
 public static Lazy <ICabinet> GetOrAddTenantContentRootFileSystem <TTenant>(this TenantShell <TTenant> tenantShell, Lazy <ICabinet> factory)
     where TTenant : class
 {
     return(tenantShell.Properties.GetOrAdd(ContentRootKey, factory) as Lazy <ICabinet>);
 }
Exemplo n.º 14
0
 public static Lazy <Task <RequestDelegate> > GetOrAddMiddlewarePipeline <TTenant>(this TenantShell <TTenant> tenantShell, Lazy <Task <RequestDelegate> > requestDelegateFactory)
     where TTenant : class
 {
     return(tenantShell.GetOrAddProperty <Lazy <Task <RequestDelegate> > >(nameof(TenantShellPipelineExtensions), requestDelegateFactory));
 }