多租户应用程序设计

This commit is contained in:
hello 2024-07-05 19:25:58 +08:00
parent dbabaaadba
commit 49f2796cc2
24 changed files with 116 additions and 25 deletions

View File

@ -1,4 +1,7 @@
using Microsoft.AspNetCore.Mvc; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using MultiTenancySample.DatabaseIsolationService.Entities; using MultiTenancySample.DatabaseIsolationService.Entities;
using MultiTenancySample.DatabaseIsolationService.EntityFrameworks; using MultiTenancySample.DatabaseIsolationService.EntityFrameworks;
@ -23,5 +26,14 @@ namespace MultiTenancySample.DatabaseIsolationService.Controllers
return Ok(products); return Ok(products);
} }
[HttpPost]
public async Task<IActionResult> CreateProduct(Product product)
{
await _dbContext.AddAsync(product);
await _dbContext.SaveChangesAsync();
return Ok(product);
}
} }
} }

View File

@ -1,4 +1,7 @@
namespace MultiTenancySample.DatabaseIsolationService.Entities // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
namespace MultiTenancySample.DatabaseIsolationService.Entities
{ {
public class Product public class Product
{ {

View File

@ -1,4 +1,7 @@
using Microsoft.EntityFrameworkCore; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.EntityFrameworkCore;
using MultiTenancySample.DatabaseIsolationService.Entities; using MultiTenancySample.DatabaseIsolationService.Entities;
using MultiTenancySample.ServiceDefaults; using MultiTenancySample.ServiceDefaults;

View File

@ -1,4 +1,7 @@
using Microsoft.EntityFrameworkCore; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.EntityFrameworkCore;
using MultiTenancySample.DatabaseIsolationService.Entities; using MultiTenancySample.DatabaseIsolationService.Entities;
using MultiTenancySample.ServiceDefaults; using MultiTenancySample.ServiceDefaults;

View File

@ -1,3 +1,6 @@
// Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using MultiTenancySample.DatabaseIsolationService.EntityFrameworks; using MultiTenancySample.DatabaseIsolationService.EntityFrameworks;
using MultiTenancySample.ServiceDefaults; using MultiTenancySample.ServiceDefaults;

View File

@ -1,4 +1,7 @@
using Microsoft.AspNetCore.Mvc; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using MultiTenancySample.FieldIsolationService.Entities; using MultiTenancySample.FieldIsolationService.Entities;
using MultiTenancySample.FieldIsolationService.EntityFrameworks; using MultiTenancySample.FieldIsolationService.EntityFrameworks;
@ -23,5 +26,15 @@ namespace MultiTenancySample.FieldIsolationService.Controllers
return Ok(products); return Ok(products);
} }
[HttpPost]
public async Task<IActionResult> CreateProduct(Product product)
{
await _dbContext.AddAsync(product);
await _dbContext.SaveChangesAsync();
return Ok(product);
}
} }
} }

View File

@ -1,4 +1,7 @@
namespace MultiTenancySample.FieldIsolationService.Entities // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
namespace MultiTenancySample.FieldIsolationService.Entities
{ {
public interface IMultiTenant public interface IMultiTenant
{ {

View File

@ -1,4 +1,7 @@
using System.Text.Json.Serialization; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using System.Text.Json.Serialization;
namespace MultiTenancySample.FieldIsolationService.Entities namespace MultiTenancySample.FieldIsolationService.Entities
{ {

View File

@ -1,16 +1,19 @@
using Microsoft.EntityFrameworkCore; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.EntityFrameworkCore;
using MultiTenancySample.FieldIsolationService.Entities; using MultiTenancySample.FieldIsolationService.Entities;
using MultiTenancySample.ServiceDefaults; using MultiTenancySample.ServiceDefaults;
namespace MultiTenancySample.FieldIsolationService.EntityFrameworks namespace MultiTenancySample.FieldIsolationService.EntityFrameworks
{ {
public class DataSeeding(IDbContextFactory<FieldIsolationServiceDbContext> dbContext, ICurrentTenant currentTenant) public class DataSeeding(IDbContextFactory<FieldIsolationServiceDbContext> dbContextFactory, ICurrentTenant currentTenant)
{ {
public async Task SeedDataAsync() public async Task SeedDataAsync()
{ {
currentTenant.SetTenant("Tenant1"); currentTenant.SetTenant("Tenant1");
FieldIsolationServiceDbContext dbContext1 = await dbContext.CreateDbContextAsync(); FieldIsolationServiceDbContext dbContext1 = await dbContextFactory.CreateDbContextAsync();
if (await dbContext1.Database.EnsureCreatedAsync()) if (await dbContext1.Database.EnsureCreatedAsync())
{ {
@ -25,7 +28,7 @@ namespace MultiTenancySample.FieldIsolationService.EntityFrameworks
currentTenant.SetTenant("Tenant2"); currentTenant.SetTenant("Tenant2");
FieldIsolationServiceDbContext dbContext2 = await dbContext.CreateDbContextAsync(); FieldIsolationServiceDbContext dbContext2 = await dbContextFactory.CreateDbContextAsync();
if (await dbContext2.Set<Product>().IgnoreQueryFilters().CountAsync() < 6) if (await dbContext2.Set<Product>().IgnoreQueryFilters().CountAsync() < 6)
{ {

View File

@ -1,4 +1,7 @@
using Microsoft.EntityFrameworkCore.Metadata.Builders; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Query; using Microsoft.EntityFrameworkCore.Query;
using System.Linq.Expressions; using System.Linq.Expressions;

View File

@ -1,4 +1,7 @@
using Microsoft.EntityFrameworkCore; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata;
using MultiTenancySample.FieldIsolationService.Entities; using MultiTenancySample.FieldIsolationService.Entities;
using MultiTenancySample.ServiceDefaults; using MultiTenancySample.ServiceDefaults;

View File

@ -1,4 +1,7 @@
using Microsoft.EntityFrameworkCore; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Diagnostics;
using MultiTenancySample.FieldIsolationService.Entities; using MultiTenancySample.FieldIsolationService.Entities;

View File

@ -1,3 +1,6 @@
// Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using MultiTenancySample.FieldIsolationService.EntityFrameworks; using MultiTenancySample.FieldIsolationService.EntityFrameworks;
using MultiTenancySample.ServiceDefaults; using MultiTenancySample.ServiceDefaults;

View File

@ -1,4 +1,7 @@
using Microsoft.AspNetCore.Mvc; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using MultiTenancySample.SchemaIsolationService.Entities; using MultiTenancySample.SchemaIsolationService.Entities;
using MultiTenancySample.SchemaIsolationService.EntityFrameworks; using MultiTenancySample.SchemaIsolationService.EntityFrameworks;

View File

@ -1,4 +1,7 @@
namespace MultiTenancySample.SchemaIsolationService.Entities // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
namespace MultiTenancySample.SchemaIsolationService.Entities
{ {
public class Product public class Product
{ {

View File

@ -1,4 +1,7 @@
using Microsoft.EntityFrameworkCore; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.EntityFrameworkCore;
using MultiTenancySample.SchemaIsolationService.Entities; using MultiTenancySample.SchemaIsolationService.Entities;
using MultiTenancySample.ServiceDefaults; using MultiTenancySample.ServiceDefaults;

View File

@ -1,4 +1,7 @@
using Microsoft.EntityFrameworkCore; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.EntityFrameworkCore;
using MultiTenancySample.SchemaIsolationService.Entities; using MultiTenancySample.SchemaIsolationService.Entities;
using MultiTenancySample.ServiceDefaults; using MultiTenancySample.ServiceDefaults;

View File

@ -1,3 +1,6 @@
// Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using MultiTenancySample.SchemaIsolationService.EntityFrameworks; using MultiTenancySample.SchemaIsolationService.EntityFrameworks;
using MultiTenancySample.ServiceDefaults; using MultiTenancySample.ServiceDefaults;

View File

@ -1,4 +1,7 @@
namespace MultiTenancySample.ServiceDefaults // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
namespace MultiTenancySample.ServiceDefaults
{ {
public class CurrentTenant : ICurrentTenant public class CurrentTenant : ICurrentTenant
{ {

View File

@ -1,4 +1,7 @@
namespace MultiTenancySample.ServiceDefaults // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
namespace MultiTenancySample.ServiceDefaults
{ {
public interface ICurrentTenant public interface ICurrentTenant
{ {

View File

@ -1,4 +1,7 @@
namespace MultiTenancySample.ServiceDefaults // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
namespace MultiTenancySample.ServiceDefaults
{ {
public interface ITenantIdProvider public interface ITenantIdProvider
{ {

View File

@ -1,4 +1,7 @@
using Microsoft.AspNetCore.Builder; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace MultiTenancySample.ServiceDefaults namespace MultiTenancySample.ServiceDefaults

View File

@ -1,4 +1,7 @@
using Microsoft.AspNetCore.Http; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.AspNetCore.Http;
namespace MultiTenancySample.ServiceDefaults namespace MultiTenancySample.ServiceDefaults
{ {
@ -10,7 +13,7 @@ namespace MultiTenancySample.ServiceDefaults
const string tenantKey = "tenant"; const string tenantKey = "tenant";
if(httpContext.User.FindAll(tenantKey).Any()) if (httpContext.User.FindAll(tenantKey).Any())
{ {
return httpContext.User.FindFirst(tenantKey)?.Value; return httpContext.User.FindFirst(tenantKey)?.Value;
} }

View File

@ -1,4 +1,7 @@
using Microsoft.AspNetCore.Http; // Copyright (c) HelloShop Corporation. All rights reserved.
// See the license file in the project root for more information.
using Microsoft.AspNetCore.Http;
namespace MultiTenancySample.ServiceDefaults namespace MultiTenancySample.ServiceDefaults
{ {