加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core – 如何将IHttpContextAccessor注入到Autofac Tena

发布时间:2020-12-15 22:15:45 所属栏目:asp.Net 来源:网络整理
导读:我正在将我的多租户应用程序从Webapi迁移到aspnet核心.在webapi版本中,我使用TenantIdentificationStrategy根据HttpContext上的请求路径识别租户. 转到aspnet核心,我能够成功连接autofac.我无法弄清楚如何连接租户策略.我尝试在ConfigureServices中注入IHttp
我正在将我的多租户应用程序从Webapi迁移到aspnet核心.在webapi版本中,我使用TenantIdentificationStrategy根据HttpContext上的请求路径识别租户.

转到aspnet核心,我能够成功连接autofac.我无法弄清楚如何连接租户策略.我尝试在ConfigureServices中注入IHttpContextAccessor

services.AddSingleton<IHttpContextAccessor,HttpContextAccessor>();

我的策略看起来像这样

public class AssetClassIdentificationStrategy: ITenantIdentificationStrategy {
    private readonly IHttpContextAccessor _accessor;
    public AssetClassIdentificationStrategy(IHttpContextAccessor httpContextAccessor)
    {
        _accessor = httpContextAccessor;
    }
    public bool TryIdentifyTenant(out object tenantId) {
        tenantId = null;
        var context = _accessor.HttpContext;
        if (context != null && context.Request != null )){
            var matchRegex = new Regex(@"/[d,.,w]*/(w*)/.*");
            var match = matchRegex.Match(context.Request.Path.ToString());
            if (match.Success) {
                tenantId = match.Groups[1].Value.ToLower();
            }
        }
        return tenantId != null;
    }
}

我所看到的是正确地注入了HttpContextAccessor,其中HttpContext总是为null.因此,没有任何多租户服务得到解决.

查看样本,但找不到符合问题的任何内容.过去在Autofacv3中有一个RequestParameterTenantIdentificationStrategy,不再受支持.感谢任何帮助.

编辑
修复了代码问题并根据请求添加Startup.cs.

public class Startup
{
    public Startup(IHostingEnvironment env) {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json",optional: true,reloadOnChange: true);

        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.Configure<CacheConfig>(Configuration.GetSection("Caching"),false);
        services.AddMvc();
        services.AddSingleton<IHttpContextAccessor,HttpContextAccessor>();
        services.AddTransient<ITenantIdentificationStrategy,AssetClassIdentificationStrategy>();

        var builder = new ContainerBuilder();
        builder.Populate(services);
        builder.RegisterType<TenantInfo>().WithProperty("TenantName","unknown").As<ITenantInfo>();

        var container = builder.Build();

        ITenantIdentificationStrategy tenantIdentificationStrategy;
        bool isMultiTenant = container.TryResolve(out tenantIdentificationStrategy);

        var mtc = new MultitenantContainer(tenantIdentificationStrategy,container);
        mtc.ConfigureTenant("pesonalLoans",b => {
            b.RegisterType<TenantInfo>().WithProperty("TenantName","pesonalLoans") .As<ITenantInfo>();
        });
        mtc.ConfigureTenant("retirement","retirement").As<ITenantInfo>();
        });

        return mtc.Resolve<IServiceProvider>();

    }

    public void Configure(IApplicationBuilder app,IHostingEnvironment env,ILoggerFactory loggerFactory)
    {
        LoggingConfig.Register(Configuration,loggerFactory);
        app.UseMvc();
    }
}


public class ValuesController : Controller {
    private ITenantInfo _tenant;
    public ValuesController(ITenantInfo tenant) {
        _tenant = tenant;
    }

    [HttpGet]
    public string Get()
    {
        return  _tenant.TenantName;
    }
}


public interface ITenantInfo {
    string TenantName { get; set; }
}
public class TenantInfo: ITenantInfo
{
    public string TenantName { get; set; }
}

编辑3 project.json

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0-rc2-3002702","type": "platform"
    },"Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final","Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final","Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final","Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final","Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-rc2-final","Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final","Microsoft.Extensions.Logging": "1.0.0-rc2-final","Microsoft.Extensions.Logging.Console": "1.0.0-rc2-final","Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-final","Autofac": "4.0.0-rc2-240","Autofac.Multitenant": "4.0.0-beta8-219","System.IdentityModel.Tokens.Jwt": "5.0.0-rc2-305061149","Autofac.Extensions.DependencyInjection": "4.0.0-rc2-240","System.Reflection": "4.1.0-rc2-24027","System.Reflection.Primitives": "4.0.1-rc2-24027","System.Reflection.Extensions": "4.0.1-rc2-24027","System.Reflection.TypeExtensions": "4.1.0-rc2-24027","System.Reflection.Emit": "4.0.1-rc2-24027","System.Reflection.Context": "4.0.1-rc2-24027","System.Reflection.DispatchProxy": "4.0.1-rc2-24027","System.Reflection.Emit.ILGeneration": "4.0.1-rc2-24027","Microsoft.AspNetCore.Diagnostics": "1.0.0-rc2-final","Microsoft.AspNet.Mvc.Formatters.Xml": "6.0.0-rc1-final","Microsoft.AspNet.Mvc.Formatters.Json": "6.0.0-rc1-final",},"tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.0.0-preview1-final","imports": "portable-net45+win8+dnxcore50"
    }
  },"frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6","dnxcore50","portable-net45+win8"
      ]
    }
  },"buildOptions": {
    "emitEntryPoint": true,"preserveCompilationContext": true
  },"runtimeOptions": {
    "gcServer": true
  },"scripts": {
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

解决方法

目前还没有办法将内容注入租户识别策略,因为策略本身不会通过DI管道.

IHttpContextAccessor通常只支持HttpContextAccessor,它仍然是一个单例,并通过从异步/线程本地上下文获取信息来起作用.当你在创业时,你可以直接使用其中一个来新建你的策略:

var strat = new MyStrategy(new HttpContextAccessor());

请注意,在最初询问问题时,多租户与ASP.NET Core IServiceProvider系统交互的方式存在问题,也就是说,它没有.

从那以后,我们发布了4.0.0-rc3-309 for the Autofac.Extensions.DependencyInjection package,解决了这个问题.

更改是您需要更新ConfigureServices以返回新的AutofacServiceProvider(mtc);并且不再返回mtc.Resolve< IServiceProvider>();.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读