多租户应用程序设计

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 MultiTenancySample.DatabaseIsolationService.Entities;
using MultiTenancySample.DatabaseIsolationService.EntityFrameworks;
@ -23,5 +26,14 @@ namespace MultiTenancySample.DatabaseIsolationService.Controllers
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
{

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.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.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.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 MultiTenancySample.FieldIsolationService.Entities;
using MultiTenancySample.FieldIsolationService.EntityFrameworks;
@ -23,5 +26,15 @@ namespace MultiTenancySample.FieldIsolationService.Controllers
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
{

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
{

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.ServiceDefaults;
namespace MultiTenancySample.FieldIsolationService.EntityFrameworks
{
public class DataSeeding(IDbContextFactory<FieldIsolationServiceDbContext> dbContext, ICurrentTenant currentTenant)
public class DataSeeding(IDbContextFactory<FieldIsolationServiceDbContext> dbContextFactory, ICurrentTenant currentTenant)
{
public async Task SeedDataAsync()
{
currentTenant.SetTenant("Tenant1");
FieldIsolationServiceDbContext dbContext1 = await dbContext.CreateDbContextAsync();
FieldIsolationServiceDbContext dbContext1 = await dbContextFactory.CreateDbContextAsync();
if (await dbContext1.Database.EnsureCreatedAsync())
{
@ -25,7 +28,7 @@ namespace MultiTenancySample.FieldIsolationService.EntityFrameworks
currentTenant.SetTenant("Tenant2");
FieldIsolationServiceDbContext dbContext2 = await dbContext.CreateDbContextAsync();
FieldIsolationServiceDbContext dbContext2 = await dbContextFactory.CreateDbContextAsync();
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 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 MultiTenancySample.FieldIsolationService.Entities;
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.Diagnostics;
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 MultiTenancySample.FieldIsolationService.EntityFrameworks;
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 MultiTenancySample.SchemaIsolationService.Entities;
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
{

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.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.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 MultiTenancySample.SchemaIsolationService.EntityFrameworks;
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
{

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
{

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
{

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;
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
{
@ -10,7 +13,7 @@ namespace MultiTenancySample.ServiceDefaults
const string tenantKey = "tenant";
if(httpContext.User.FindAll(tenantKey).Any())
if (httpContext.User.FindAll(tenantKey).Any())
{
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
{