迁移多租户.net 5 到 7

问题描述 投票:0回答:1

我想将多租户从 5 更新为 7

示例

city-a.site.com
city-b.site.com

背景

public class MemoryDbContext : DbContext
{
    public MemoryDbContext(DbContextOptions<MemoryDbContext> options) : base(options)
    {
    }

    protected MemoryDbContext()
    {
    }

    public DbSet<Tenant> Tenants { get; set; }
}

租户属性类

public class TenantAttribute : ActionFilterAttribute
{
    private readonly MemoryDbContext _memoryDbContext;

    public TenantAttribute(MemoryDbContext memoryDbContext)
    {
        _memoryDbContext = memoryDbContext;
    }

    public override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
    {
        var fullAddress = actionExecutingContext.HttpContext?.Request?
            .Headers?["Host"].ToString()?.Split('.');

        if (fullAddress.Length < 2)
        {
            //Redirect WWW
            var redirectUrl = "https://www.example.com";
            actionExecutingContext.Result = new RedirectResult(redirectUrl, true);
        }
        else
        {
            var subdomain = fullAddress[0];
            var tenant = _memoryDbContext.Tenants
                .SingleOrDefault(t => string.Equals(t.Host, subdomain, StringComparison.OrdinalIgnoreCase));

            if (tenant != null)
            {
                actionExecutingContext.RouteData.Values.Add("tenant", tenant);
                base.OnActionExecuting(actionExecutingContext);
            }
            else
            {
                //Redirect WWW
                var redirectUrl = "https://www.example.com";
                actionExecutingContext.Result = new RedirectResult(redirectUrl, true);
            }
        }
    }
}

型号

public class Tenant
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Host { get; set; }
    //City Or Group
    public int Cog { get; set; }
    public int MainId { get; set; }
    public string SubId { get; set; }
}

定制服务

services.AddScoped(typeof(TenantAttribute));

配置服务

services.AddDbContext<MemoryDbContext>(options => options.UseInMemoryDatabase("MemoryDb"));

曾在 .net 5 工作过

public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        var context = services.GetRequiredService<MemoryDbContext>();
        context.Database.EnsureCreated();

        if (!context.Tenants.Any())
        {
            context.Tenants.Add(new Tenant() { Name = "City1", Host = "city-a", Cog = 2, MainId = 1, SubId = "1" });
            context.Tenants.Add(new Tenant() { Name = "City2", Host = "city-b", Cog = 2, MainId = 2, SubId = "2" });
            context.SaveChanges();
        }
    }

    host.Run();
}

我在 .NET 7 中尝试过:

var builder = WebApplication.CreateBuilder(args);
ConfigureLogging(builder.Logging, builder.Environment, builder.Configuration);
ConfigureServices(builder.Services, builder.Configuration, builder.Environment);

var host = Host.CreateDefaultBuilder(args).Build();

using (var scope = host.Services.CreateScope())
{
    scope.RunScopedServicec<MemoryDbContext>();
    var services = scope.ServiceProvider;
    var context = services.GetRequiredService<MemoryDbContext>();

    context.Database.EnsureCreated();

    if (!context.Tenants.Any())
    {
        context.Tenants.Add(new Tenant() { Name = "City1", Host = "city-a", Cog = 2, MainId = 1, SubId = "1" });
            context.Tenants.Add(new Tenant() { Name = "City2", Host = "city-b", Cog = 2, MainId = 2, SubId = "2" });
        context.SaveChanges();
    }
}

host.Run();

var webApp = builder.Build();

错误

系统无效操作异常
H结果=0x80131509
消息=未注册类型“Site.DataLayer.Context.MemoryDbContext”的服务。

来源=Microsoft.Extensions.DependencyInjection.Abstractions

堆栈跟踪:
在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 提供程序,类型 serviceType)
在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider 提供程序)
在计划中。

asp.net-core multi-tenant
1个回答
0
投票

试试这个:

var builder = WebApplication.CreateBuilder(args);
ConfigureLogging(builder.Logging, builder.Environment, builder.Configuration);
ConfigureServices(builder.Services, builder.Configuration, builder.Environment);

var webApp = builder.Build();

using (var scope = webApp.Services.CreateScope())
{
    scope.RunScopedServicec<MemoryDbContext>();
    var services = scope.ServiceProvider;
    var context = services.GetRequiredService<MemoryDbContext>();

    context.Database.EnsureCreated();

    if (!context.Tenants.Any())
    {
        context.Tenants.Add(new Tenant() { Name = "City1", Host = "city-a", Cog = 2, MainId = 1, SubId = "1" });
            context.Tenants.Add(new Tenant() { Name = "City2", Host = "city-b", Cog = 2, MainId = 2, SubId = "2" });
        context.SaveChanges();
    }
}

webApp.Run();
© www.soinside.com 2019 - 2024. All rights reserved.