首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InvalidOperationException:无法解析类型的服务

InvalidOperationException:无法解析类型的服务
EN

Stack Overflow用户
提问于 2016-12-17 07:47:10
回答 1查看 4.2K关注 0票数 0

我是使用saaskit多租赁项目的多租户应用。

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

然而,有时它会给我带来以下错误

出现了未处理的异常:无法解析“LMS.Model.AppTenant”类型的服务,同时试图激活“LMS.Controllers.OrganizationController”。

此错误随机发生在任何控制器和执行的任何操作方法上。错误的性质不特定于任何控制器/操作方法。

我可以看到我的代码成功地进入了TenantResolver,这实际上返回了一个租户,但是当DI将它注入到我的控制器时,它会用所列的错误来抱怨。

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

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

对此有任何帮助!

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

代码语言:javascript
复制
public class HomeController
    {
        public HomeController(TenantContext<AppTenant> tenantContext)
        {

        }
    }

下面是使tenantContext可注入的扩展类

代码语言:javascript
复制
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;
        }
    }

对此有任何帮助,非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-17 10:26:21

你不能/不应该那样做。问题在于你的登记:

代码语言:javascript
复制
// Make Tenant and TenantContext injectable
services.AddScoped(prov => 
    prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenant<TTenant>());

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

他们两个都可以是null!当您注册一个依赖项时,它必须是--绝不null

例如,在这种情况下,您必须确保始终返回Tenant,如果没有租户信息,则返回一个泛型或未初始化的Tenant实例。你的TenantContext<AppTenant>也一样。它必须始终是非空的,但是租户可能不必包含有效的租户信息,也就是说,您可以在它上有一个IsValid属性来检查它是否是有效的租户。

当有人错误地输入包含租户的url部分或访问页面w/o (一个租户头)(或者不管您如何处理租户)时,您可能会有一个无效的租户。

有时或有时不会出现此问题的原因是,服务是每个请求(范围),因此,对于每个请求,它将再次尝试调用工厂方法,并且每次调用都会导致null。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41196529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档