From 0127b43374ca11a7efb3baf8571e2f9adbda5212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Thu, 2 Mar 2023 10:19:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=A4=9A=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BasicTenantInfo.cs | 24 ++++++++ .../CurrentTenant.cs | 60 +++++++++++++++++++ .../DefaultCurrentTenantAccessor.cs | 28 +++++++++ .../Extensions/MultiTenancyExtensions.cs | 42 +++++++++++++ .../ICurrentTenant.cs | 29 +++++++++ .../ICurrentTenantAccessor.cs | 12 ++++ .../ITenantResolveContext.cs | 21 +++++++ .../ITenantResolveContributor.cs | 19 ++++++ .../ITenantResolver.cs | 13 ++++ .../ConfigurationTenantResolveContributor.cs | 41 +++++++++++++ .../CurrentUserTenantResolveContributor.cs | 40 +++++++++++++ .../HttpHeaderTenantResolveContributor.cs | 52 ++++++++++++++++ .../TenantResolveContext.cs | 35 +++++++++++ .../TenantResolveContributorBase.cs | 19 ++++++ .../TenantResolveOptions.cs | 27 +++++++++ .../TenantResolveResult.cs | 17 ++++++ .../TenantResolver.cs | 49 +++++++++++++++ .../Yi.Framework.MultiTenancy.csproj | 5 ++ .../YiFrameworkMultiTenancyModule.cs | 21 +++++-- .../YiFrameworkFileManagerModule.cs | 6 ++ .../YiFrameworkOperLogManagerModule.cs | 6 +- 21 files changed, 560 insertions(+), 6 deletions(-) create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/BasicTenantInfo.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/CurrentTenant.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/DefaultCurrentTenantAccessor.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/Extensions/MultiTenancyExtensions.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ICurrentTenant.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ICurrentTenantAccessor.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolveContext.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolveContributor.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolver.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/ConfigurationTenantResolveContributor.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/CurrentUserTenantResolveContributor.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/HttpHeaderTenantResolveContributor.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveContext.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveContributorBase.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveOptions.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveResult.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolver.cs diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/BasicTenantInfo.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/BasicTenantInfo.cs new file mode 100644 index 00000000..7b564ea3 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/BasicTenantInfo.cs @@ -0,0 +1,24 @@ +namespace Yi.Framework.MultiTenancy; + +/// +/// 租户信息 +/// +public class BasicTenantInfo +{ + /// + /// 租户ID + /// + public Guid? TenantId { get; } + + /// + /// 租户ID 名称 + /// + public string Name { get; } + + /// + public BasicTenantInfo(Guid? tenantId, string? name = null) + { + TenantId = tenantId; + Name = name ?? string.Empty; + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/CurrentTenant.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/CurrentTenant.cs new file mode 100644 index 00000000..0bbf4825 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/CurrentTenant.cs @@ -0,0 +1,60 @@ +using Yi.Framework.Core.Utils; + +namespace Yi.Framework.MultiTenancy; + +/// +/// 当前租户实现 +/// +public class CurrentTenant : ICurrentTenant +{ + private readonly ICurrentTenantAccessor _currentTenantAccessor; + + /// + public CurrentTenant(ICurrentTenantAccessor currentTenantAccessor) + { + _currentTenantAccessor = currentTenantAccessor; + } + + /// + /// 是否有效 + /// + public virtual bool IsAvailable => Id != Guid.Empty; + + /// + /// 租户ID + /// + public virtual Guid Id => _currentTenantAccessor.Current?.TenantId ?? Guid.Empty; + + /// + /// 租户名称 + /// + public string? Name => _currentTenantAccessor.Current?.Name; + + /// + /// 替换租户 + /// + /// + /// + /// + public IDisposable Change(Guid? id, string? name = null) + { + return SetCurrent(id, name); + } + + /// + /// 设置当前租户 + /// + /// + private IDisposable SetCurrent(Guid? tenantId, string? name = null) + { + BasicTenantInfo? parentScope = _currentTenantAccessor.Current; + _currentTenantAccessor.Current = new BasicTenantInfo(tenantId, name); + + return new DisposeAction>(static ((ICurrentTenantAccessor, BasicTenantInfo) state) => + { + (ICurrentTenantAccessor currentTenantAccessor, BasicTenantInfo parentScope) = state; + currentTenantAccessor.Current = parentScope; + }, + (_currentTenantAccessor, parentScope)); + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/DefaultCurrentTenantAccessor.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/DefaultCurrentTenantAccessor.cs new file mode 100644 index 00000000..83ec524a --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/DefaultCurrentTenantAccessor.cs @@ -0,0 +1,28 @@ +namespace Yi.Framework.MultiTenancy; + +/// +/// 默认租户访问器实现 +/// +public class DefaultCurrentTenantAccessor : ICurrentTenantAccessor +{ + private ITenantResolver _tenantResolver; + + /// + public DefaultCurrentTenantAccessor(ITenantResolver tenantResolver) + { + _tenantResolver = tenantResolver; + TenantResolveResult? tenantResolveResult = _tenantResolver.ResolveTenantIdOrNameAsync().Result; + string? tenantIdStr = tenantResolveResult.TenantIdOrName; + + Current = Guid.TryParse(tenantIdStr, out Guid tehnantId) + ? new BasicTenantInfo(tehnantId) + : new BasicTenantInfo(Guid.Empty); + } + + /// + /// 当前租户信息 + /// + public BasicTenantInfo Current { get; set; } + +} + diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/Extensions/MultiTenancyExtensions.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/Extensions/MultiTenancyExtensions.cs new file mode 100644 index 00000000..1d93bcf8 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/Extensions/MultiTenancyExtensions.cs @@ -0,0 +1,42 @@ +using Microsoft.Extensions.DependencyInjection; +using Yi.Framework.MultiTenancy.ResolveContributor; + +namespace Yi.Framework.MultiTenancy.Extensions; + +/// +/// 租户注入扩展方法 +/// +public static class MultiTenancyExtensions +{ + /// + /// 注入 租户 + /// + /// + /// + public static IServiceCollection AddCurrentTenant(this IServiceCollection services) + { + services.Configure(option => + { + //添加租户解析器,默认添加从当前用户中获取 + + //添加从httpheader,解析TenantId配置的租户id + option.TenantResolvers.Add(new HttpHeaderTenantResolveContributor()); + + //添加配置租户解析器,解析TenantId配置的租户id + option.TenantResolvers.Add(new ConfigurationTenantResolveContributor()); + }); + + //添加租户解析器注入 + services.AddTransient(); + + //添加当前租户 + services.AddTransient(); + + //添加默认访问器 + services.AddTransient(); + + return services; + + + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ICurrentTenant.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ICurrentTenant.cs new file mode 100644 index 00000000..2d892e11 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ICurrentTenant.cs @@ -0,0 +1,29 @@ +namespace Yi.Framework.MultiTenancy; + +/// +/// 当前租户接口 +/// +public interface ICurrentTenant +{ + /// + /// 是否有效 + /// + bool IsAvailable { get; } + + /// + /// 租户ID + /// + Guid Id { get; } + + /// + /// 租户名称 + /// + string? Name { get; } + + /// + /// 替换租户 + /// + /// + /// + IDisposable Change(Guid? id, string? name = null); +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ICurrentTenantAccessor.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ICurrentTenantAccessor.cs new file mode 100644 index 00000000..63b2cbff --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ICurrentTenantAccessor.cs @@ -0,0 +1,12 @@ +namespace Yi.Framework.MultiTenancy; + +/// +/// 租户访问器 +/// +public interface ICurrentTenantAccessor +{ + /// + /// 当前租户信息 + /// + BasicTenantInfo Current { get; set; } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolveContext.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolveContext.cs new file mode 100644 index 00000000..90585528 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolveContext.cs @@ -0,0 +1,21 @@ +namespace Yi.Framework.MultiTenancy; + +/// +/// 解析器上下文 +/// (作用于各个)之间 +/// +public interface ITenantResolveContext +{ + /// + IServiceProvider ServiceProvider { get; } + + /// + /// 租户ID 或 名称 + /// + string TenantIdOrName { get; set; } + + /// + /// 是否已处理 + /// + bool Handled { get; set; } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolveContributor.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolveContributor.cs new file mode 100644 index 00000000..a1e4737a --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolveContributor.cs @@ -0,0 +1,19 @@ +namespace Yi.Framework.MultiTenancy; + +/// +/// 租户解析器贡献者 +/// +public interface ITenantResolveContributor +{ + /// + /// 贡献者名称 + /// + string Name { get; } + + /// + /// 解析 + /// + /// 解析器上下文 + /// + Task ResolveAsync(ITenantResolveContext context); +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolver.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolver.cs new file mode 100644 index 00000000..0f3987e7 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ITenantResolver.cs @@ -0,0 +1,13 @@ +namespace Yi.Framework.MultiTenancy; + +/// +/// 租户解析器接口 +/// +public interface ITenantResolver +{ + /// + /// 解析租户Id或名称 + /// + /// + Task ResolveTenantIdOrNameAsync(); +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/ConfigurationTenantResolveContributor.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/ConfigurationTenantResolveContributor.cs new file mode 100644 index 00000000..7396d552 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/ConfigurationTenantResolveContributor.cs @@ -0,0 +1,41 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Yi.Framework.Data.Entities; +using Yi.Framework.MultiTenancy; + +namespace Yi.Framework.MultiTenancy.ResolveContributor; + +/// +/// 租户解析器贡献者 +/// +public class ConfigurationTenantResolveContributor : TenantResolveContributorBase +{ + /// + /// 租户解析器贡献者基类 + /// + public override string Name => "Configuration"; + + /// + /// 解析 + /// + /// 解析器上下文 + /// + public override Task ResolveAsync(ITenantResolveContext context) + { + IConfiguration? configuration = context.ServiceProvider.GetRequiredService(); + + string? tenantIdStr = configuration.GetValue(nameof(IMultiTenant.TenantId)); + + if (Guid.TryParse(tenantIdStr, out Guid tenantId)) + { + if (tenantId != Guid.Empty) + { + context.TenantIdOrName = tenantId.ToString(); + context.Handled = true; + } + } + + context.Handled = false; + return Task.CompletedTask; + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/CurrentUserTenantResolveContributor.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/CurrentUserTenantResolveContributor.cs new file mode 100644 index 00000000..bed9477b --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/CurrentUserTenantResolveContributor.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.DependencyInjection; +using Yi.Framework.Core.CurrentUsers; + +namespace Yi.Framework.MultiTenancy.ResolveContributor; + +/// +/// 当前用户中获取租户 +/// +public class CurrentUserTenantResolveContributor : TenantResolveContributorBase +{ + /// + /// 贡献者名称 + /// + public const string ContributorName = "CurrentUser"; + + /// + /// 贡献者名称 + /// + public override string Name => ContributorName; + + /// + /// 解析 + /// + /// 解析器上下文 + /// + public override Task ResolveAsync(ITenantResolveContext context) + { + ICurrentUser currentUser = context.ServiceProvider.GetRequiredService(); + if (currentUser.TenantId != Guid.Empty) + { + context.Handled = true; + context.TenantIdOrName = currentUser.TenantId.ToString(); + } + else + { + context.Handled = false; + } + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/HttpHeaderTenantResolveContributor.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/HttpHeaderTenantResolveContributor.cs new file mode 100644 index 00000000..bfc6b8cd --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/ResolveContributor/HttpHeaderTenantResolveContributor.cs @@ -0,0 +1,52 @@ + +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Yi.Framework.Data.Entities; +using Yi.Framework.MultiTenancy; + +namespace Yi.Framework.MultiTenancy.ResolveContributor; + +/// +/// 租户解析器贡献者 +/// +public class HttpHeaderTenantResolveContributor : TenantResolveContributorBase +{ + /// + /// 贡献者名称 + /// + public override string Name => "HttpHeader"; + + /// + /// 解析 + /// + /// 解析器上下文 + /// + public override Task ResolveAsync(ITenantResolveContext context) + { + IHttpContextAccessor? httpContextAccessor = context.ServiceProvider.GetService(); + + //如果没有注入http对象,直接跳出 + if (httpContextAccessor is null) + { + return Task.CompletedTask; + } + HttpContext? httpContext = httpContextAccessor.HttpContext; + if (httpContext is not null) + { + string? tenantId = httpContext.Request.Headers + .Where(x => x.Key == nameof(IMultiTenant.TenantId)) + .Select(x => x.Value.ToString()) + .FirstOrDefault(); + + if (tenantId is not null) + { + if (Guid.TryParse(tenantId, out Guid tid)) + { + context.TenantIdOrName = tid.ToString(); + context.Handled = true; + } + } + } + return Task.CompletedTask; + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveContext.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveContext.cs new file mode 100644 index 00000000..49ff8723 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveContext.cs @@ -0,0 +1,35 @@ +namespace Yi.Framework.MultiTenancy; + +/// +/// 解析器上下文 +/// +public class TenantResolveContext : ITenantResolveContext +{ + /// + public TenantResolveContext(IServiceProvider serviceProvider) + { + ServiceProvider = serviceProvider; + } + + /// + public IServiceProvider ServiceProvider { get; } + + /// + /// 租户ID 或 名称 + /// + public string TenantIdOrName { get; set; } + + /// + /// 是否已处理 + /// + public bool Handled { get; set; } + + /// + /// 是否已经处理或者为有效值 + /// + public bool HasResolvedTenantOrHost() + { + return Handled + || TenantIdOrName != Guid.Empty.ToString() && !string.IsNullOrWhiteSpace(TenantIdOrName); + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveContributorBase.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveContributorBase.cs new file mode 100644 index 00000000..6a926822 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveContributorBase.cs @@ -0,0 +1,19 @@ +namespace Yi.Framework.MultiTenancy; + +/// +/// 租户解析器贡献者基类 +/// +public abstract class TenantResolveContributorBase : ITenantResolveContributor +{ + /// + /// 贡献者名称 + /// + public abstract string Name { get; } + + /// + /// 解析 + /// + /// 解析器上下文 + /// + public abstract Task ResolveAsync(ITenantResolveContext context); +} \ No newline at end of file diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveOptions.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveOptions.cs new file mode 100644 index 00000000..b84ce407 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveOptions.cs @@ -0,0 +1,27 @@ + + +using Yi.Framework.MultiTenancy.ResolveContributor; + +namespace Yi.Framework.MultiTenancy; + +/// +/// 解析器属性 +/// +public class TenantResolveOptions +{ + /// + /// 构造函数 + /// + public TenantResolveOptions() + { + TenantResolvers = new List + { + new CurrentUserTenantResolveContributor() + }; + } + + /// + /// 解析器贡献者。由这帮东西为框架提供 租户ID + /// + public List TenantResolvers { get; } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveResult.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveResult.cs new file mode 100644 index 00000000..08c0e70c --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolveResult.cs @@ -0,0 +1,17 @@ +namespace Yi.Framework.MultiTenancy; + +/// +/// 租户解析器结果 +/// +public class TenantResolveResult +{ + /// + /// 租户ID 或 名称 + /// + public string TenantIdOrName { get; set; } = Guid.Empty.ToString(); + + /// + /// 存储遍历过的 + /// + public List AppliedResolvers { get; } = new List(); +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolver.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolver.cs new file mode 100644 index 00000000..e1cdc0f0 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/TenantResolver.cs @@ -0,0 +1,49 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; + +namespace Yi.Framework.MultiTenancy; + +/// +/// +/// +public class TenantResolver : ITenantResolver +{ + private readonly IServiceProvider _serviceProvider; + private readonly TenantResolveOptions _options; + + /// + /// 构造函数 + /// + public TenantResolver(IOptions options, IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + _options = options.Value; + } + + /// + /// 解析租户Id或名称 + /// + public virtual async Task ResolveTenantIdOrNameAsync() + { + TenantResolveResult? result = new TenantResolveResult(); + + using (IServiceScope? serviceScope = _serviceProvider.CreateScope()) + { + TenantResolveContext? context = new TenantResolveContext(serviceScope.ServiceProvider); + + foreach (ITenantResolveContributor tenantResolver in _options.TenantResolvers) + { + await tenantResolver.ResolveAsync(context); + + result.AppliedResolvers.Add(tenantResolver.Name); + + if (context.HasResolvedTenantOrHost()) + { + result.TenantIdOrName = context.TenantIdOrName; + break; + } + } + } + return result; + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/Yi.Framework.MultiTenancy.csproj b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/Yi.Framework.MultiTenancy.csproj index 132c02c5..4a1d9a1a 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/Yi.Framework.MultiTenancy.csproj +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/Yi.Framework.MultiTenancy.csproj @@ -6,4 +6,9 @@ enable + + + + + diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/YiFrameworkMultiTenancyModule.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/YiFrameworkMultiTenancyModule.cs index 96af9a94..808ec642 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/YiFrameworkMultiTenancyModule.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.MultiTenancy/YiFrameworkMultiTenancyModule.cs @@ -1,7 +1,20 @@ -namespace Yi.Framework.MultiTenancy -{ - public class YiFrameworkMultiTenancyModule - { +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using StartupModules; +using Yi.Framework.MultiTenancy.Extensions; +namespace Yi.Framework.MultiTenancy +{ + public class YiFrameworkMultiTenancyModule : IStartupModule + { + public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context) + { + + } + + public void ConfigureServices(IServiceCollection services, ConfigureServicesContext context) + { + services.AddCurrentTenant(); + } } } \ No newline at end of file diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs index 34d1deb2..c2c5e25c 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs @@ -1,9 +1,15 @@ using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using StartupModules; +using Yi.Framework.Core.Attributes; +using Yi.Framework.Core; +using Yi.Framework.Ddd; namespace Yi.Framework.FileManager { + [DependsOn( + typeof(YiFrameworkDddModule) + )] public class YiFrameworkFileManagerModule : IStartupModule { public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context) diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs index 653d1a11..4c641b5d 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs @@ -1,12 +1,14 @@ using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using StartupModules; -using Yi.Framework.Core; using Yi.Framework.Core.Attributes; +using Yi.Framework.Ddd; namespace Yi.Framework.OperLogManager { - [DependsOn(typeof(YiFrameworkCoreModule))] + [DependsOn( + typeof(YiFrameworkDddModule) + )] public class YiFrameworkOperLogManagerModule : IStartupModule { public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)