Browse Source

Merge pull request #17074 from abpframework/liangshiwei/group4

Group4 Enable nullable annotations
pull/17099/head
maliming 3 years ago
committed by GitHub
parent
commit
df4fa5af32
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj
  2. 4
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs
  3. 2
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpMultiTenancyCookieHelper.cs
  4. 2
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs
  5. 4
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs
  6. 2
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs
  7. 6
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs
  8. 2
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpContextTenantResolveResultAccessor.cs
  9. 2
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributorBase.cs
  10. 6
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs
  11. 8
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs
  12. 2
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs
  13. 2
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo.Abp.MultiTenancy.Abstractions.csproj
  14. 6
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/BasicTenantInfo.cs
  15. 6
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ICurrentTenant.cs
  16. 2
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ICurrentTenantAccessor.cs
  17. 2
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantConfigurationProvider.cs
  18. 3
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContext.cs
  19. 3
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveResultAccessor.cs
  20. 8
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantStore.cs
  21. 4
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConfiguration.cs
  22. 8
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConnectionStringUpdatedEto.cs
  23. 2
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantCreatedEto.cs
  24. 2
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveContext.cs
  25. 2
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveResult.cs
  26. 2
      framework/src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj
  27. 6
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs
  28. 8
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationStore/DefaultTenantStore.cs
  29. 8
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentTenant.cs
  30. 40
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs
  31. 2
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/NullTenantResolveResultAccessor.cs
  32. 6
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs
  33. 2
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContext.cs
  34. 2
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantSettingValueProvider.cs
  35. 2
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Urls/AppUrlProvider.cs

2
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj

@ -5,6 +5,8 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<WarningsAsErrors>Nullable</WarningsAsErrors>
<AssemblyName>Volo.Abp.AspNetCore.MultiTenancy</AssemblyName> <AssemblyName>Volo.Abp.AspNetCore.MultiTenancy</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.MultiTenancy</PackageId> <PackageId>Volo.Abp.AspNetCore.MultiTenancy</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> <AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

4
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs

@ -105,7 +105,7 @@ public class AbpAspNetCoreMultiTenancyOptions
else else
{ {
var transcodingStream = Encoding.CreateTranscodingStream(context.Response.Body, resolvedContentTypeEncoding, Encoding.UTF8, leaveOpen: true); var transcodingStream = Encoding.CreateTranscodingStream(context.Response.Body, resolvedContentTypeEncoding, Encoding.UTF8, leaveOpen: true);
ExceptionDispatchInfo exceptionDispatchInfo = null; ExceptionDispatchInfo? exceptionDispatchInfo = null;
try try
{ {
await JsonSerializer.SerializeAsync(transcodingStream, error, error.GetType(), jsonSerializerOptions, context.RequestAborted); await JsonSerializer.SerializeAsync(transcodingStream, error, error.GetType(), jsonSerializerOptions, context.RequestAborted);
@ -138,7 +138,7 @@ public class AbpAspNetCoreMultiTenancyOptions
var details = exception is BusinessException businessException ? businessException.Details : string.Empty; var details = exception is BusinessException businessException ? businessException.Details : string.Empty;
await context.Response.WriteAsync($"<html lang=\"{HtmlEncoder.Default.Encode(CultureInfo.CurrentCulture.Name)}\"><body>\r\n"); await context.Response.WriteAsync($"<html lang=\"{HtmlEncoder.Default.Encode(CultureInfo.CurrentCulture.Name)}\"><body>\r\n");
await context.Response.WriteAsync($"<h3>{HtmlEncoder.Default.Encode(message)}</h3>{HtmlEncoder.Default.Encode(details)}<br>\r\n"); await context.Response.WriteAsync($"<h3>{HtmlEncoder.Default.Encode(message)}</h3>{HtmlEncoder.Default.Encode(details!)}<br>\r\n");
await context.Response.WriteAsync("</body></html>\r\n"); await context.Response.WriteAsync("</body></html>\r\n");
// Note the 500 spaces are to work around an IE 'feature' // Note the 500 spaces are to work around an IE 'feature'

2
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpMultiTenancyCookieHelper.cs

@ -14,7 +14,7 @@ public static class AbpMultiTenancyCookieHelper
{ {
context.Response.Cookies.Append( context.Response.Cookies.Append(
tenantKey, tenantKey,
tenantId.ToString(), tenantId.ToString()!,
new CookieOptions new CookieOptions
{ {
Path = "/", Path = "/",

2
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs

@ -10,7 +10,7 @@ public class CookieTenantResolveContributor : HttpTenantResolveContributorBase
public override string Name => ContributorName; public override string Name => ContributorName;
protected override Task<string> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) protected override Task<string?> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext)
{ {
return Task.FromResult(httpContext.Request.Cookies[context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey]); return Task.FromResult(httpContext.Request.Cookies[context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey]);
} }

4
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs

@ -23,11 +23,11 @@ public class DomainTenantResolveContributor : HttpTenantResolveContributorBase
_domainFormat = domainFormat.RemovePreFix(ProtocolPrefixes); _domainFormat = domainFormat.RemovePreFix(ProtocolPrefixes);
} }
protected override Task<string> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) protected override Task<string?> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext)
{ {
if (!httpContext.Request.Host.HasValue) if (!httpContext.Request.Host.HasValue)
{ {
return Task.FromResult<string>(null); return Task.FromResult<string?>(null);
} }
var hostName = httpContext.Request.Host.Value.RemovePreFix(ProtocolPrefixes); var hostName = httpContext.Request.Host.Value.RemovePreFix(ProtocolPrefixes);

2
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs

@ -12,7 +12,7 @@ public class FormTenantResolveContributor : HttpTenantResolveContributorBase
public override string Name => ContributorName; public override string Name => ContributorName;
protected override async Task<string> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) protected override async Task<string?> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext)
{ {
if (!httpContext.Request.HasFormContentType) if (!httpContext.Request.HasFormContentType)
{ {

6
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs

@ -14,11 +14,11 @@ public class HeaderTenantResolveContributor : HttpTenantResolveContributorBase
public override string Name => ContributorName; public override string Name => ContributorName;
protected override Task<string> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) protected override Task<string?> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext)
{ {
if (httpContext.Request.Headers.IsNullOrEmpty()) if (httpContext.Request.Headers.IsNullOrEmpty())
{ {
return Task.FromResult((string)null); return Task.FromResult((string?)null);
} }
var tenantIdKey = context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey; var tenantIdKey = context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey;
@ -26,7 +26,7 @@ public class HeaderTenantResolveContributor : HttpTenantResolveContributorBase
var tenantIdHeader = httpContext.Request.Headers[tenantIdKey]; var tenantIdHeader = httpContext.Request.Headers[tenantIdKey];
if (tenantIdHeader == string.Empty || tenantIdHeader.Count < 1) if (tenantIdHeader == string.Empty || tenantIdHeader.Count < 1)
{ {
return Task.FromResult((string)null); return Task.FromResult((string?)null);
} }
if (tenantIdHeader.Count > 1) if (tenantIdHeader.Count > 1)

2
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpContextTenantResolveResultAccessor.cs

@ -9,7 +9,7 @@ public class HttpContextTenantResolveResultAccessor : ITenantResolveResultAccess
{ {
public const string HttpContextItemName = "__AbpTenantResolveResult"; public const string HttpContextItemName = "__AbpTenantResolveResult";
public TenantResolveResult Result { public TenantResolveResult? Result {
get => _httpContextAccessor.HttpContext?.Items[HttpContextItemName] as TenantResolveResult; get => _httpContextAccessor.HttpContext?.Items[HttpContextItemName] as TenantResolveResult;
set { set {
if (_httpContextAccessor.HttpContext == null) if (_httpContextAccessor.HttpContext == null)

2
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributorBase.cs

@ -39,5 +39,5 @@ public abstract class HttpTenantResolveContributorBase : TenantResolveContributo
} }
} }
protected abstract Task<string> GetTenantIdOrNameFromHttpContextOrNullAsync([NotNull] ITenantResolveContext context, [NotNull] HttpContext httpContext); protected abstract Task<string?> GetTenantIdOrNameFromHttpContextOrNullAsync([NotNull] ITenantResolveContext context, [NotNull] HttpContext httpContext);
} }

6
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs

@ -40,7 +40,7 @@ public class MultiTenancyMiddleware : IMiddleware, ITransientDependency
public async Task InvokeAsync(HttpContext context, RequestDelegate next) public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{ {
TenantConfiguration tenant = null; TenantConfiguration? tenant = null;
try try
{ {
tenant = await _tenantConfigurationProvider.GetAsync(saveResolveResult: true); tenant = await _tenantConfigurationProvider.GetAsync(saveResolveResult: true);
@ -86,7 +86,7 @@ public class MultiTenancyMiddleware : IMiddleware, ITransientDependency
} }
} }
private async Task<RequestCulture> TryGetRequestCultureAsync(HttpContext httpContext) private async Task<RequestCulture?> TryGetRequestCultureAsync(HttpContext httpContext)
{ {
var requestCultureFeature = httpContext.Features.Get<IRequestCultureFeature>(); var requestCultureFeature = httpContext.Features.Get<IRequestCultureFeature>();
@ -114,7 +114,7 @@ public class MultiTenancyMiddleware : IMiddleware, ITransientDependency
string culture; string culture;
string uiCulture; string uiCulture;
if (defaultLanguage.Contains(';')) if (defaultLanguage!.Contains(';'))
{ {
var splitted = defaultLanguage.Split(';'); var splitted = defaultLanguage.Split(';');
culture = splitted[0]; culture = splitted[0];

8
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs

@ -11,7 +11,7 @@ public class QueryStringTenantResolveContributor : HttpTenantResolveContributorB
public override string Name => ContributorName; public override string Name => ContributorName;
protected override Task<string> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) protected override Task<string?> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext)
{ {
if (httpContext.Request.QueryString.HasValue) if (httpContext.Request.QueryString.HasValue)
{ {
@ -22,13 +22,13 @@ public class QueryStringTenantResolveContributor : HttpTenantResolveContributorB
if (tenantValue.IsNullOrWhiteSpace()) if (tenantValue.IsNullOrWhiteSpace())
{ {
context.Handled = true; context.Handled = true;
return Task.FromResult<string>(null); return Task.FromResult<string?>(null);
} }
return Task.FromResult(tenantValue); return Task.FromResult(tenantValue)!;
} }
} }
return Task.FromResult<string>(null); return Task.FromResult<string?>(null);
} }
} }

2
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs

@ -12,7 +12,7 @@ public class RouteTenantResolveContributor : HttpTenantResolveContributorBase
public override string Name => ContributorName; public override string Name => ContributorName;
protected override Task<string> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) protected override Task<string?> GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext)
{ {
var tenantId = httpContext.GetRouteValue(context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey); var tenantId = httpContext.GetRouteValue(context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey);
return Task.FromResult(tenantId != null ? Convert.ToString(tenantId) : null); return Task.FromResult(tenantId != null ? Convert.ToString(tenantId) : null);

2
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo.Abp.MultiTenancy.Abstractions.csproj

@ -5,6 +5,8 @@
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net7.0</TargetFrameworks> <TargetFrameworks>netstandard2.0;netstandard2.1;net7.0</TargetFrameworks>
<Nullable>enable</Nullable>
<WarningsAsErrors>Nullable</WarningsAsErrors>
<AssemblyName>Volo.Abp.MultiTenancy.Abstractions</AssemblyName> <AssemblyName>Volo.Abp.MultiTenancy.Abstractions</AssemblyName>
<PackageId>Volo.Abp.MultiTenancy.Abstractions</PackageId> <PackageId>Volo.Abp.MultiTenancy.Abstractions</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> <AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

6
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/BasicTenantInfo.cs

@ -9,16 +9,14 @@ public class BasicTenantInfo
/// Null indicates the host. /// Null indicates the host.
/// Not null value for a tenant. /// Not null value for a tenant.
/// </summary> /// </summary>
[CanBeNull]
public Guid? TenantId { get; } public Guid? TenantId { get; }
/// <summary> /// <summary>
/// Name of the tenant if <see cref="TenantId"/> is not null. /// Name of the tenant if <see cref="TenantId"/> is not null.
/// </summary> /// </summary>
[CanBeNull] public string? Name { get; }
public string Name { get; }
public BasicTenantInfo(Guid? tenantId, string name = null) public BasicTenantInfo(Guid? tenantId, string? name = null)
{ {
TenantId = tenantId; TenantId = tenantId;
Name = name; Name = name;

6
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ICurrentTenant.cs

@ -7,11 +7,9 @@ public interface ICurrentTenant
{ {
bool IsAvailable { get; } bool IsAvailable { get; }
[CanBeNull]
Guid? Id { get; } Guid? Id { get; }
[CanBeNull] string? Name { get; }
string Name { get; }
IDisposable Change(Guid? id, string name = null); IDisposable Change(Guid? id, string? name = null);
} }

2
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ICurrentTenantAccessor.cs

@ -7,5 +7,5 @@ namespace Volo.Abp.MultiTenancy;
public interface ICurrentTenantAccessor public interface ICurrentTenantAccessor
{ {
BasicTenantInfo Current { get; set; } BasicTenantInfo? Current { get; set; }
} }

2
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantConfigurationProvider.cs

@ -4,5 +4,5 @@ namespace Volo.Abp.MultiTenancy;
public interface ITenantConfigurationProvider public interface ITenantConfigurationProvider
{ {
Task<TenantConfiguration> GetAsync(bool saveResolveResult = false); Task<TenantConfiguration?> GetAsync(bool saveResolveResult = false);
} }

3
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContext.cs

@ -5,8 +5,7 @@ namespace Volo.Abp.MultiTenancy;
public interface ITenantResolveContext : IServiceProviderAccessor public interface ITenantResolveContext : IServiceProviderAccessor
{ {
[CanBeNull] string? TenantIdOrName { get; set; }
string TenantIdOrName { get; set; }
bool Handled { get; set; } bool Handled { get; set; }
} }

3
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveResultAccessor.cs

@ -4,6 +4,5 @@ namespace Volo.Abp.MultiTenancy;
public interface ITenantResolveResultAccessor public interface ITenantResolveResultAccessor
{ {
[CanBeNull] TenantResolveResult? Result { get; set; }
TenantResolveResult Result { get; set; }
} }

8
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantStore.cs

@ -5,13 +5,13 @@ namespace Volo.Abp.MultiTenancy;
public interface ITenantStore public interface ITenantStore
{ {
Task<TenantConfiguration> FindAsync(string name); Task<TenantConfiguration?> FindAsync(string name);
Task<TenantConfiguration> FindAsync(Guid id); Task<TenantConfiguration?> FindAsync(Guid id);
[Obsolete("Use FindAsync method.")] [Obsolete("Use FindAsync method.")]
TenantConfiguration Find(string name); TenantConfiguration? Find(string name);
[Obsolete("Use FindAsync method.")] [Obsolete("Use FindAsync method.")]
TenantConfiguration Find(Guid id); TenantConfiguration? Find(Guid id);
} }

4
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConfiguration.cs

@ -9,9 +9,9 @@ public class TenantConfiguration
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
public string Name { get; set; } public string Name { get; set; } = default!;
public ConnectionStrings ConnectionStrings { get; set; } public ConnectionStrings? ConnectionStrings { get; set; }
public bool IsActive { get; set; } public bool IsActive { get; set; }

8
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConnectionStringUpdatedEto.cs

@ -10,11 +10,11 @@ public class TenantConnectionStringUpdatedEto : EtoBase
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
public string Name { get; set; } public string Name { get; set; } = default!;
public string ConnectionStringName { get; set; } public string ConnectionStringName { get; set; } = default!;
public string OldValue { get; set; } public string? OldValue { get; set; }
public string NewValue { get; set; } public string? NewValue { get; set; }
} }

2
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantCreatedEto.cs

@ -10,5 +10,5 @@ public class TenantCreatedEto : EtoBase
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
public string Name { get; set; } public string Name { get; set; } = default!;
} }

2
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveContext.cs

@ -6,7 +6,7 @@ public class TenantResolveContext : ITenantResolveContext
{ {
public IServiceProvider ServiceProvider { get; } public IServiceProvider ServiceProvider { get; }
public string TenantIdOrName { get; set; } public string? TenantIdOrName { get; set; }
public bool Handled { get; set; } public bool Handled { get; set; }

2
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolveResult.cs

@ -4,7 +4,7 @@ namespace Volo.Abp.MultiTenancy;
public class TenantResolveResult public class TenantResolveResult
{ {
public string TenantIdOrName { get; set; } public string? TenantIdOrName { get; set; }
public List<string> AppliedResolvers { get; } public List<string> AppliedResolvers { get; }

2
framework/src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj

@ -5,6 +5,8 @@
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net7.0</TargetFrameworks> <TargetFrameworks>netstandard2.0;netstandard2.1;net7.0</TargetFrameworks>
<Nullable>enable</Nullable>
<WarningsAsErrors>Nullable</WarningsAsErrors>
<AssemblyName>Volo.Abp.MultiTenancy</AssemblyName> <AssemblyName>Volo.Abp.MultiTenancy</AssemblyName>
<PackageId>Volo.Abp.MultiTenancy</PackageId> <PackageId>Volo.Abp.MultiTenancy</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> <AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

6
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs

@ -7,15 +7,15 @@ public class AsyncLocalCurrentTenantAccessor : ICurrentTenantAccessor
{ {
public static AsyncLocalCurrentTenantAccessor Instance { get; } = new(); public static AsyncLocalCurrentTenantAccessor Instance { get; } = new();
public BasicTenantInfo Current { public BasicTenantInfo? Current {
get => _currentScope.Value; get => _currentScope.Value;
set => _currentScope.Value = value; set => _currentScope.Value = value;
} }
private readonly AsyncLocal<BasicTenantInfo> _currentScope; private readonly AsyncLocal<BasicTenantInfo?> _currentScope;
private AsyncLocalCurrentTenantAccessor() private AsyncLocalCurrentTenantAccessor()
{ {
_currentScope = new AsyncLocal<BasicTenantInfo>(); _currentScope = new AsyncLocal<BasicTenantInfo?>();
} }
} }

8
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ConfigurationStore/DefaultTenantStore.cs

@ -16,22 +16,22 @@ public class DefaultTenantStore : ITenantStore, ITransientDependency
_options = options.CurrentValue; _options = options.CurrentValue;
} }
public Task<TenantConfiguration> FindAsync(string name) public Task<TenantConfiguration?> FindAsync(string name)
{ {
return Task.FromResult(Find(name)); return Task.FromResult(Find(name));
} }
public Task<TenantConfiguration> FindAsync(Guid id) public Task<TenantConfiguration?> FindAsync(Guid id)
{ {
return Task.FromResult(Find(id)); return Task.FromResult(Find(id));
} }
public TenantConfiguration Find(string name) public TenantConfiguration? Find(string name)
{ {
return _options.Tenants?.FirstOrDefault(t => t.Name == name); return _options.Tenants?.FirstOrDefault(t => t.Name == name);
} }
public TenantConfiguration Find(Guid id) public TenantConfiguration? Find(Guid id)
{ {
return _options.Tenants?.FirstOrDefault(t => t.Id == id); return _options.Tenants?.FirstOrDefault(t => t.Id == id);
} }

8
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentTenant.cs

@ -9,7 +9,7 @@ public class CurrentTenant : ICurrentTenant, ITransientDependency
public virtual Guid? Id => _currentTenantAccessor.Current?.TenantId; public virtual Guid? Id => _currentTenantAccessor.Current?.TenantId;
public string Name => _currentTenantAccessor.Current?.Name; public string? Name => _currentTenantAccessor.Current?.Name;
private readonly ICurrentTenantAccessor _currentTenantAccessor; private readonly ICurrentTenantAccessor _currentTenantAccessor;
@ -18,17 +18,17 @@ public class CurrentTenant : ICurrentTenant, ITransientDependency
_currentTenantAccessor = currentTenantAccessor; _currentTenantAccessor = currentTenantAccessor;
} }
public IDisposable Change(Guid? id, string name = null) public IDisposable Change(Guid? id, string? name = null)
{ {
return SetCurrent(id, name); return SetCurrent(id, name);
} }
private IDisposable SetCurrent(Guid? tenantId, string name = null) private IDisposable SetCurrent(Guid? tenantId, string? name = null)
{ {
var parentScope = _currentTenantAccessor.Current; var parentScope = _currentTenantAccessor.Current;
_currentTenantAccessor.Current = new BasicTenantInfo(tenantId, name); _currentTenantAccessor.Current = new BasicTenantInfo(tenantId, name);
return new DisposeAction<ValueTuple<ICurrentTenantAccessor, BasicTenantInfo>>(static (state) => return new DisposeAction<ValueTuple<ICurrentTenantAccessor, BasicTenantInfo?>>(static (state) =>
{ {
var (currentTenantAccessor, parentScope) = state; var (currentTenantAccessor, parentScope) = state;
currentTenantAccessor.Current = parentScope; currentTenantAccessor.Current = parentScope;

40
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs

@ -24,7 +24,7 @@ public class MultiTenantConnectionStringResolver : DefaultConnectionStringResolv
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
} }
public override async Task<string> ResolveAsync(string connectionStringName = null) public override async Task<string> ResolveAsync(string? connectionStringName = null)
{ {
if (_currentTenant.Id == null) if (_currentTenant.Id == null)
{ {
@ -40,7 +40,7 @@ public class MultiTenantConnectionStringResolver : DefaultConnectionStringResolv
return await base.ResolveAsync(connectionStringName); return await base.ResolveAsync(connectionStringName);
} }
var tenantDefaultConnectionString = tenant.ConnectionStrings.Default; var tenantDefaultConnectionString = tenant.ConnectionStrings?.Default;
//Requesting default connection string... //Requesting default connection string...
if (connectionStringName == null || if (connectionStringName == null ||
@ -48,41 +48,41 @@ public class MultiTenantConnectionStringResolver : DefaultConnectionStringResolv
{ {
//Return tenant's default or global default //Return tenant's default or global default
return !tenantDefaultConnectionString.IsNullOrWhiteSpace() return !tenantDefaultConnectionString.IsNullOrWhiteSpace()
? tenantDefaultConnectionString ? tenantDefaultConnectionString!
: Options.ConnectionStrings.Default; : Options.ConnectionStrings.Default!;
} }
//Requesting specific connection string... //Requesting specific connection string...
var connString = tenant.ConnectionStrings.GetOrDefault(connectionStringName); var connString = tenant.ConnectionStrings?.GetOrDefault(connectionStringName);
if (!connString.IsNullOrWhiteSpace()) if (!connString.IsNullOrWhiteSpace())
{ {
//Found for the tenant //Found for the tenant
return connString; return connString!;
} }
//Fallback to the mapped database for the specific connection string //Fallback to the mapped database for the specific connection string
var database = Options.Databases.GetMappedDatabaseOrNull(connectionStringName); var database = Options.Databases.GetMappedDatabaseOrNull(connectionStringName);
if (database != null && database.IsUsedByTenants) if (database != null && database.IsUsedByTenants)
{ {
connString = tenant.ConnectionStrings.GetOrDefault(database.DatabaseName); connString = tenant.ConnectionStrings?.GetOrDefault(database.DatabaseName);
if (!connString.IsNullOrWhiteSpace()) if (!connString.IsNullOrWhiteSpace())
{ {
//Found for the tenant //Found for the tenant
return connString; return connString!;
} }
} }
//Fallback to tenant's default connection string if available //Fallback to tenant's default connection string if available
if (!tenantDefaultConnectionString.IsNullOrWhiteSpace()) if (!tenantDefaultConnectionString.IsNullOrWhiteSpace())
{ {
return tenantDefaultConnectionString; return tenantDefaultConnectionString!;
} }
return await base.ResolveAsync(connectionStringName); return await base.ResolveAsync(connectionStringName);
} }
[Obsolete("Use ResolveAsync method.")] [Obsolete("Use ResolveAsync method.")]
public override string Resolve(string connectionStringName = null) public override string Resolve(string? connectionStringName = null)
{ {
if (_currentTenant.Id == null) if (_currentTenant.Id == null)
{ {
@ -98,7 +98,7 @@ public class MultiTenantConnectionStringResolver : DefaultConnectionStringResolv
return base.Resolve(connectionStringName); return base.Resolve(connectionStringName);
} }
var tenantDefaultConnectionString = tenant.ConnectionStrings.Default; var tenantDefaultConnectionString = tenant.ConnectionStrings?.Default;
//Requesting default connection string... //Requesting default connection string...
if (connectionStringName == null || if (connectionStringName == null ||
@ -106,42 +106,42 @@ public class MultiTenantConnectionStringResolver : DefaultConnectionStringResolv
{ {
//Return tenant's default or global default //Return tenant's default or global default
return !tenantDefaultConnectionString.IsNullOrWhiteSpace() return !tenantDefaultConnectionString.IsNullOrWhiteSpace()
? tenantDefaultConnectionString ? tenantDefaultConnectionString!
: Options.ConnectionStrings.Default; : Options.ConnectionStrings.Default!;
} }
//Requesting specific connection string... //Requesting specific connection string...
var connString = tenant.ConnectionStrings.GetOrDefault(connectionStringName); var connString = tenant.ConnectionStrings?.GetOrDefault(connectionStringName);
if (!connString.IsNullOrWhiteSpace()) if (!connString.IsNullOrWhiteSpace())
{ {
//Found for the tenant //Found for the tenant
return connString; return connString!;
} }
//Fallback to tenant's default connection string if available //Fallback to tenant's default connection string if available
if (!tenantDefaultConnectionString.IsNullOrWhiteSpace()) if (!tenantDefaultConnectionString.IsNullOrWhiteSpace())
{ {
return tenantDefaultConnectionString; return tenantDefaultConnectionString!;
} }
//Try to find the specific connection string for given name //Try to find the specific connection string for given name
var connStringInOptions = Options.ConnectionStrings.GetOrDefault(connectionStringName); var connStringInOptions = Options.ConnectionStrings.GetOrDefault(connectionStringName);
if (!connStringInOptions.IsNullOrWhiteSpace()) if (!connStringInOptions.IsNullOrWhiteSpace())
{ {
return connStringInOptions; return connStringInOptions!;
} }
//Fallback to the global default connection string //Fallback to the global default connection string
var defaultConnectionString = Options.ConnectionStrings.Default; var defaultConnectionString = Options.ConnectionStrings.Default;
if (!defaultConnectionString.IsNullOrWhiteSpace()) if (!defaultConnectionString.IsNullOrWhiteSpace())
{ {
return defaultConnectionString; return defaultConnectionString!;
} }
throw new AbpException("No connection string defined!"); throw new AbpException("No connection string defined!");
} }
protected virtual async Task<TenantConfiguration> FindTenantConfigurationAsync(Guid tenantId) protected virtual async Task<TenantConfiguration?> FindTenantConfigurationAsync(Guid tenantId)
{ {
using (var serviceScope = _serviceProvider.CreateScope()) using (var serviceScope = _serviceProvider.CreateScope())
{ {
@ -154,7 +154,7 @@ public class MultiTenantConnectionStringResolver : DefaultConnectionStringResolv
} }
[Obsolete("Use FindTenantConfigurationAsync method.")] [Obsolete("Use FindTenantConfigurationAsync method.")]
protected virtual TenantConfiguration FindTenantConfiguration(Guid tenantId) protected virtual TenantConfiguration? FindTenantConfiguration(Guid tenantId)
{ {
using (var serviceScope = _serviceProvider.CreateScope()) using (var serviceScope = _serviceProvider.CreateScope())
{ {

2
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/NullTenantResolveResultAccessor.cs

@ -4,7 +4,7 @@ namespace Volo.Abp.MultiTenancy;
public class NullTenantResolveResultAccessor : ITenantResolveResultAccessor, ISingletonDependency public class NullTenantResolveResultAccessor : ITenantResolveResultAccessor, ISingletonDependency
{ {
public TenantResolveResult Result { public TenantResolveResult? Result {
get => null; get => null;
set { } set { }
} }

6
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs

@ -25,7 +25,7 @@ public class TenantConfigurationProvider : ITenantConfigurationProvider, ITransi
StringLocalizer = stringLocalizer; StringLocalizer = stringLocalizer;
} }
public virtual async Task<TenantConfiguration> GetAsync(bool saveResolveResult = false) public virtual async Task<TenantConfiguration?> GetAsync(bool saveResolveResult = false)
{ {
var resolveResult = await TenantResolver.ResolveTenantIdOrNameAsync(); var resolveResult = await TenantResolver.ResolveTenantIdOrNameAsync();
@ -34,7 +34,7 @@ public class TenantConfigurationProvider : ITenantConfigurationProvider, ITransi
TenantResolveResultAccessor.Result = resolveResult; TenantResolveResultAccessor.Result = resolveResult;
} }
TenantConfiguration tenant = null; TenantConfiguration? tenant = null;
if (resolveResult.TenantIdOrName != null) if (resolveResult.TenantIdOrName != null)
{ {
tenant = await FindTenantAsync(resolveResult.TenantIdOrName); tenant = await FindTenantAsync(resolveResult.TenantIdOrName);
@ -61,7 +61,7 @@ public class TenantConfigurationProvider : ITenantConfigurationProvider, ITransi
return tenant; return tenant;
} }
protected virtual async Task<TenantConfiguration> FindTenantAsync(string tenantIdOrName) protected virtual async Task<TenantConfiguration?> FindTenantAsync(string tenantIdOrName)
{ {
if (Guid.TryParse(tenantIdOrName, out var parsedTenantId)) if (Guid.TryParse(tenantIdOrName, out var parsedTenantId))
{ {

2
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContext.cs

@ -6,7 +6,7 @@ public class TenantResolveContext : ITenantResolveContext
{ {
public IServiceProvider ServiceProvider { get; } public IServiceProvider ServiceProvider { get; }
public string TenantIdOrName { get; set; } public string? TenantIdOrName { get; set; }
public bool Handled { get; set; } public bool Handled { get; set; }

2
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantSettingValueProvider.cs

@ -19,7 +19,7 @@ public class TenantSettingValueProvider : SettingValueProvider
CurrentTenant = currentTenant; CurrentTenant = currentTenant;
} }
public async override Task<string> GetOrNullAsync(SettingDefinition setting) public async override Task<string?> GetOrNullAsync(SettingDefinition setting)
{ {
return await SettingStore.GetOrNullAsync(setting.Name, Name, CurrentTenant.Id?.ToString()); return await SettingStore.GetOrNullAsync(setting.Name, Name, CurrentTenant.Id?.ToString());
} }

2
framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Urls/AppUrlProvider.cs

@ -112,7 +112,7 @@ public class AppUrlProvider : IAppUrlProvider, ITransientDependency
if (CurrentTenant.Id.HasValue && CurrentTenant.Name.IsNullOrEmpty()) if (CurrentTenant.Id.HasValue && CurrentTenant.Name.IsNullOrEmpty())
{ {
var tenantConfiguration = await TenantStore.FindAsync(CurrentTenant.Id.Value); var tenantConfiguration = await TenantStore.FindAsync(CurrentTenant.Id.Value);
return tenantConfiguration.Name; return tenantConfiguration!.Name;
} }
return CurrentTenant.Name!; return CurrentTenant.Name!;

Loading…
Cancel
Save