InvalidOperationException:无法解析类型的服务

InvalidOperationException: Unable to resolve service for type

我正在为多租户应用程序使用 saaskit 多租户项目。

我能够创建租户上下文并能够访问所有控制器。

但是,有时会出现以下错误

An unhandled exception has occurred: Unable to resolve service for type 'LMS.Model.AppTenant' while attempting to activate 'LMS.Controllers.OrganizationController'.

对于任何控制器和执行的任何操作方法,此错误都是随机发生的。错误的性质并不特定于任何 controller/action 方法。

我可以看到我的代码成功进入了 TenantResolver,它实际上 return 一个租户但是当 DI 将它注入我的控制器时它抱怨列出的错误

发生此错误后,我的应用程序完全停止并显示白屏。

此问题发生在生产服务器上,而不是本地主机上。

对此有任何帮助!

像这样在所有控制器中注入租户

public class HomeController
    {
        public HomeController(TenantContext<AppTenant> tenantContext)
        {

        }
    }

以下是扩展 class tenantContext 可注入的地方

public static class MultitenancyServiceCollectionExtensions
    {
        public static IServiceCollection AddMultitenancy<TTenant, TResolver>(this IServiceCollection services) 
            where TResolver : class, ITenantResolver<TTenant>
            where TTenant : class
        {
            Ensure.Argument.NotNull(services, nameof(services));

            services.AddScoped<ITenantResolver<TTenant>, TResolver>();

            // Make Tenant and TenantContext injectable
            services.AddScoped(prov => 
                prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenant<TTenant>());

            services.AddScoped(prov =>
                prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenantContext<TTenant>());

            // Ensure caching is available for caching resolvers
            services.AddMemoryCache();

            return services;
        }
    }

感谢任何帮助!

你不能t/shouldn那样做。问题在于您的注册:

// Make Tenant and TenantContext injectable
services.AddScoped(prov => 
    prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenant<TTenant>());

services.AddScoped(prov =>
    prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenantContext<TTenant>());

两个都可以null!当你注册一个依赖时,它必须 NEVERnull!

在这种情况下,例如,您必须确保 Tenant 将始终被 returned,如果没有租户信息,return 一个通用的或未初始化的 Tenant实例。您的 TenantContext<AppTenant> 也一样。它必须始终是 non-null,但租户可能不必包含有效的租户信息,即您可以在其上使用 IsValid 属性 来检查它是否是有效租户。

当有人错误输入包含租户的 url 部分或访问页面 w/o 租户 header (或者您正在处理租户)时,您可能有一个无效的租户.

您有时会遇到此问题而有时不会遇到此问题的原因是因为服务是按请求(范围内的)进行的,因此对于每个请求,它都会尝试再次调用工厂方法,并且每次都可能导致 null .