我想将多租户从 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 提供程序)
在计划中。
试试这个:
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();