Browse Source

Enable nullable annotations for Volo.Abp.Http.Client

pull/17560/head
liangshiwei 3 years ago
parent
commit
caa21184c5
  1. 2
      framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionHttpClientProxyExtensions.cs
  2. 2
      framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj
  3. 2
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Authentication/IAbpAccessTokenProvider.cs
  4. 2
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Authentication/NullAbpAccessTokenProvider.cs
  5. 8
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyApiDescriptionFinder.cs
  6. 26
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs
  7. 21
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyRequestPayloadBuilder.cs
  8. 14
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyUrlBuilder.cs
  9. 6
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/CurrentApiVersionInfo.cs
  10. 2
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/IClientProxyApiDescriptionFinder.cs
  11. 4
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ICurrentApiVersionInfo.cs
  12. 2
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs
  13. 4
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
  14. 2
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Proxying/HttpActionParameterHelper.cs

2
framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionHttpClientProxyExtensions.cs

@ -191,7 +191,7 @@ public static class ServiceCollectionHttpClientProxyExtensions
return Activator.CreateInstance(
typeof(HttpClientProxy<>).MakeGenericType(type),
service
);
)!;
});
return services;

2
framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj

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

2
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Authentication/IAbpAccessTokenProvider.cs

@ -4,5 +4,5 @@ namespace Volo.Abp.Http.Client.Authentication;
public interface IAbpAccessTokenProvider
{
Task<string> GetTokenAsync();
Task<string?> GetTokenAsync();
}

2
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Authentication/NullAbpAccessTokenProvider.cs

@ -5,7 +5,7 @@ namespace Volo.Abp.Http.Client.Authentication;
public class NullAbpAccessTokenProvider : IAbpAccessTokenProvider, ITransientDependency
{
public Task<string> GetTokenAsync()
public Task<string?> GetTokenAsync()
{
return Task.FromResult(null as string);
}

8
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyApiDescriptionFinder.cs

@ -17,7 +17,7 @@ public class ClientProxyApiDescriptionFinder : IClientProxyApiDescriptionFinder,
protected IVirtualFileProvider VirtualFileProvider { get; }
protected IJsonSerializer JsonSerializer { get; }
protected Dictionary<string, ActionApiDescriptionModel> ActionApiDescriptionModels { get; }
protected ApplicationApiDescriptionModel ApplicationApiDescriptionModel { get; set; }
protected ApplicationApiDescriptionModel ApplicationApiDescriptionModel { get; set; } = default!;
public ClientProxyApiDescriptionFinder(
IVirtualFileProvider virtualFileProvider,
@ -30,7 +30,7 @@ public class ClientProxyApiDescriptionFinder : IClientProxyApiDescriptionFinder,
Initialize();
}
public ActionApiDescriptionModel FindAction(string methodName)
public ActionApiDescriptionModel? FindAction(string methodName)
{
return ActionApiDescriptionModels.ContainsKey(methodName) ? ActionApiDescriptionModels[methodName] : null;
}
@ -113,7 +113,7 @@ public class ClientProxyApiDescriptionFinder : IClientProxyApiDescriptionFinder,
return rootPath + physicalDirectoryInfo.Name.EnsureStartsWith('/');
}
return fileInfo.PhysicalPath;
return fileInfo.PhysicalPath!;
}
private string GetProxyFileInfoPath(string rootPath, IFileInfo fileInfo)
@ -123,6 +123,6 @@ public class ClientProxyApiDescriptionFinder : IClientProxyApiDescriptionFinder,
return rootPath + physicalFileInfo.Name.EnsureStartsWith('/');
}
return fileInfo.GetVirtualOrPhysicalPathOrNull();
return fileInfo.GetVirtualOrPhysicalPathOrNull()!;
}
}

26
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs

@ -25,7 +25,7 @@ namespace Volo.Abp.Http.Client.ClientProxying;
public class ClientProxyBase<TService> : ITransientDependency
{
public IAbpLazyServiceProvider LazyServiceProvider { get; set; }
public IAbpLazyServiceProvider LazyServiceProvider { get; set; } = default!;
protected IClientProxyApiDescriptionFinder ClientProxyApiDescriptionFinder => LazyServiceProvider.LazyGetRequiredService<IClientProxyApiDescriptionFinder>();
protected ICancellationTokenProvider CancellationTokenProvider => LazyServiceProvider.LazyGetRequiredService<ICancellationTokenProvider>();
@ -42,17 +42,17 @@ public class ClientProxyBase<TService> : ITransientDependency
protected ICurrentApiVersionInfo CurrentApiVersionInfo => LazyServiceProvider.LazyGetRequiredService<ICurrentApiVersionInfo>();
protected ILocalEventBus LocalEventBus => LazyServiceProvider.LazyGetRequiredService<ILocalEventBus>();
protected virtual async Task RequestAsync(string methodName, ClientProxyRequestTypeValue arguments = null)
protected virtual async Task RequestAsync(string methodName, ClientProxyRequestTypeValue? arguments = null)
{
await RequestAsync(BuildHttpProxyClientProxyContext(methodName, arguments));
}
protected virtual async Task<T> RequestAsync<T>(string methodName, ClientProxyRequestTypeValue arguments = null)
protected virtual async Task<T> RequestAsync<T>(string methodName, ClientProxyRequestTypeValue? arguments = null)
{
return await RequestAsync<T>(BuildHttpProxyClientProxyContext(methodName, arguments));
}
protected virtual ClientProxyRequestContext BuildHttpProxyClientProxyContext(string methodName, ClientProxyRequestTypeValue arguments = null)
protected virtual ClientProxyRequestContext BuildHttpProxyClientProxyContext(string methodName, ClientProxyRequestTypeValue? arguments = null)
{
if (arguments == null)
{
@ -67,7 +67,7 @@ public class ClientProxyBase<TService> : ITransientDependency
}
var actionArguments = action.Parameters.GroupBy(x => x.NameOnMethod).ToList();
if (action.SupportedVersions.Any())
if (action.SupportedVersions != null && action.SupportedVersions.Any())
{
//TODO: make names configurable
actionArguments.RemoveAll(x => x.Key == "api-version" || x.Key == "apiVersion");
@ -107,7 +107,7 @@ public class ClientProxyBase<TService> : ITransientDependency
if (stringContent.IsNullOrWhiteSpace())
{
return default;
return default!;
}
return JsonSerializer.Deserialize<T>(stringContent);
@ -177,7 +177,7 @@ public class ClientProxyBase<TService> : ITransientDependency
var versionParam = requestContext.Action.Parameters.FirstOrDefault(p => p.Name == "apiVersion" && p.BindingSourceId == ParameterBindingSources.Path) ??
requestContext.Action.Parameters.FirstOrDefault(p => p.Name == "api-version" && p.BindingSourceId == ParameterBindingSources.Query);
return new ApiVersionInfo(versionParam?.BindingSourceId, apiVersion);
return new ApiVersionInfo(versionParam?.BindingSourceId!, apiVersion);
}
protected virtual async Task<string> GetUrlWithParametersAsync(ClientProxyRequestContext requestContext, ApiVersionInfo apiVersion)
@ -185,7 +185,7 @@ public class ClientProxyBase<TService> : ITransientDependency
return await ClientProxyUrlBuilder.GenerateUrlWithParametersAsync(requestContext.Action, requestContext.Arguments, apiVersion);
}
protected virtual async Task<HttpContent> GetHttpContentAsync(ClientProxyRequestContext requestContext, ApiVersionInfo apiVersion)
protected virtual async Task<HttpContent?> GetHttpContentAsync(ClientProxyRequestContext requestContext, ApiVersionInfo apiVersion)
{
return await ClientProxyRequestPayloadBuilder.BuildContentAsync(requestContext.Action, requestContext.Arguments, JsonSerializer, apiVersion);
}
@ -199,15 +199,15 @@ public class ClientProxyBase<TService> : ITransientDependency
return configuredVersion ?? "1.0";
}
if (requestContext.Action.SupportedVersions.Contains(configuredVersion))
if (requestContext.Action.SupportedVersions!.Contains(configuredVersion!))
{
return configuredVersion;
return configuredVersion!;
}
return requestContext.Action.SupportedVersions.Last(); //TODO: Ensure to get the latest version!
}
protected virtual async Task<string> GetConfiguredApiVersionAsync(ClientProxyRequestContext requestContext)
protected virtual async Task<string?> GetConfiguredApiVersionAsync(ClientProxyRequestContext requestContext)
{
var clientConfig = ClientOptions.Value.HttpClientProxies.GetOrDefault(requestContext.ServiceType)
?? throw new AbpException($"Could not get DynamicHttpClientProxyConfig for {requestContext.ServiceType.FullName}.");
@ -220,8 +220,8 @@ public class ClientProxyBase<TService> : ITransientDependency
{
await LocalEventBus.PublishAsync(new ClientProxyExceptionEventData()
{
StatusCode = (int?)response?.StatusCode,
ReasonPhrase = response?.ReasonPhrase
StatusCode = (int?)response.StatusCode,
ReasonPhrase = response.ReasonPhrase
});
if (response.Headers.Contains(AbpHttpConsts.AbpErrorFormat))

21
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyRequestPayloadBuilder.cs

@ -40,8 +40,7 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
HttpClientProxyingOptions = httpClientProxyingOptions.Value;
}
[CanBeNull]
public virtual async Task<HttpContent> BuildContentAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments, IJsonSerializer jsonSerializer, ApiVersionInfo apiVersion)
public virtual async Task<HttpContent?> BuildContentAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments, IJsonSerializer jsonSerializer, ApiVersionInfo apiVersion)
{
var body = await GenerateBodyAsync(action, methodArguments, jsonSerializer);
if (body != null)
@ -54,7 +53,7 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
return body;
}
protected virtual Task<HttpContent> GenerateBodyAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments, IJsonSerializer jsonSerializer)
protected virtual Task<HttpContent?> GenerateBodyAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments, IJsonSerializer jsonSerializer)
{
var parameters = action
.Parameters
@ -63,7 +62,7 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
if (parameters.Length <= 0)
{
return Task.FromResult<HttpContent>(null);
return Task.FromResult<HttpContent?>(null);
}
if (parameters.Length > 1)
@ -76,13 +75,13 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
var value = HttpActionParameterHelper.FindParameterValue(methodArguments, parameters[0]);
if (value == null)
{
return Task.FromResult<HttpContent>(null);
return Task.FromResult<HttpContent?>(null);
}
return Task.FromResult<HttpContent>(new StringContent(jsonSerializer.Serialize(value), Encoding.UTF8, MimeTypes.Application.Json));
return Task.FromResult<HttpContent?>(new StringContent(jsonSerializer.Serialize(value), Encoding.UTF8, MimeTypes.Application.Json));
}
protected virtual async Task<HttpContent> GenerateFormPostDataAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments)
protected virtual async Task<HttpContent?> GenerateFormPostDataAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments)
{
var parameters = action
.Parameters
@ -108,7 +107,7 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var formDataContents = await (Task<List<KeyValuePair<string, HttpContent>>>)CallObjectToFormDataAsyncMethod
var formDataContents = await (Task<List<KeyValuePair<string, HttpContent>>?>)CallObjectToFormDataAsyncMethod
.MakeGenericMethod(value.GetType())
.Invoke(this, new object[]
{
@ -116,7 +115,7 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
action,
parameter,
value
});
})!;
if (formDataContents != null)
{
@ -158,12 +157,12 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
{
foreach (var item in (IEnumerable) value)
{
formData.Add(new StringContent(item.ToString(), Encoding.UTF8), parameter.Name);
formData.Add(new StringContent(item.ToString()!, Encoding.UTF8), parameter.Name);
}
}
else
{
formData.Add(new StringContent(value.ToString(), Encoding.UTF8), parameter.Name);
formData.Add(new StringContent(value.ToString()!, Encoding.UTF8), parameter.Name);
}
}

14
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyUrlBuilder.cs

@ -100,15 +100,15 @@ public class ClientProxyUrlBuilder : ITransientDependency
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var path = await (Task<string>)CallObjectToPathAsyncMethod
var path = await (Task<string?>)CallObjectToPathAsyncMethod
.MakeGenericMethod(value.GetType())
.Invoke(this, new object[]
.Invoke(this, new object?[]
{
scope.ServiceProvider.GetRequiredService(HttpClientProxyingOptions.PathConverts[value.GetType()]),
action,
pathParameter,
value
});
})!;
if (path != null)
{
@ -143,7 +143,7 @@ public class ClientProxyUrlBuilder : ITransientDependency
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var queryString = await (Task<string>)CallObjectToQueryStringAsyncMethod
var queryString = await (Task<string?>)CallObjectToQueryStringAsyncMethod
.MakeGenericMethod(value.GetType())
.Invoke(this, new object[]
{
@ -151,7 +151,7 @@ public class ClientProxyUrlBuilder : ITransientDependency
action,
queryStringParameter,
value
});
})!;
if (queryString != null)
{
@ -218,11 +218,11 @@ public class ClientProxyUrlBuilder : ITransientDependency
return true;
}
protected virtual Task<string> ConvertValueToStringAsync([CanBeNull] object value)
protected virtual Task<string?> ConvertValueToStringAsync(object? value)
{
if (value is DateTime dateTimeValue)
{
return Task.FromResult(dateTimeValue.ToUniversalTime().ToString("O"));
return Task.FromResult(dateTimeValue.ToUniversalTime().ToString("O"))!;
}
return Task.FromResult(value?.ToString());

6
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/CurrentApiVersionInfo.cs

@ -6,11 +6,11 @@ namespace Volo.Abp.Http.Client.ClientProxying;
public class CurrentApiVersionInfo : ICurrentApiVersionInfo, ISingletonDependency
{
public ApiVersionInfo ApiVersionInfo => _currentApiVersionInfo.Value;
public ApiVersionInfo? ApiVersionInfo => _currentApiVersionInfo.Value;
private readonly AsyncLocal<ApiVersionInfo> _currentApiVersionInfo = new AsyncLocal<ApiVersionInfo>();
private readonly AsyncLocal<ApiVersionInfo?> _currentApiVersionInfo = new AsyncLocal<ApiVersionInfo?>();
public virtual IDisposable Change(ApiVersionInfo apiVersionInfo)
public virtual IDisposable Change(ApiVersionInfo? apiVersionInfo)
{
var parent = ApiVersionInfo;
_currentApiVersionInfo.Value = apiVersionInfo;

2
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/IClientProxyApiDescriptionFinder.cs

@ -4,7 +4,7 @@ namespace Volo.Abp.Http.Client.ClientProxying;
public interface IClientProxyApiDescriptionFinder
{
ActionApiDescriptionModel FindAction(string methodName);
ActionApiDescriptionModel? FindAction(string methodName);
ApplicationApiDescriptionModel GetApiDescription();
}

4
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ICurrentApiVersionInfo.cs

@ -4,7 +4,7 @@ namespace Volo.Abp.Http.Client.ClientProxying;
public interface ICurrentApiVersionInfo
{
ApiVersionInfo ApiVersionInfo { get; }
ApiVersionInfo? ApiVersionInfo { get; }
IDisposable Change(ApiVersionInfo apiVersionInfo);
IDisposable Change(ApiVersionInfo? apiVersionInfo);
}

2
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs

@ -118,7 +118,7 @@ public class ApiDescriptionFinder : IApiDescriptionFinder, ITransientDependency
var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ApplicationApiDescriptionModel>(content, DeserializeOptions);
var result = JsonSerializer.Deserialize<ApplicationApiDescriptionModel>(content, DeserializeOptions)!;
return result;
}

4
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs

@ -66,7 +66,7 @@ public class DynamicHttpProxyInterceptor<TService> : AbpInterceptor, ITransientD
var returnType = invocation.Method.ReturnType.GenericTypeArguments[0];
var result = (Task)CallRequestAsyncMethod
.MakeGenericMethod(returnType)
.Invoke(this, new object[] { context });
.Invoke(this, new object[] { context })!;
invocation.ReturnValue = await GetResultAsync(result, returnType);
}
@ -99,6 +99,6 @@ public class DynamicHttpProxyInterceptor<TService> : AbpInterceptor, ITransientD
.MakeGenericType(resultType)
.GetProperty(nameof(Task<object>.Result), BindingFlags.Instance | BindingFlags.Public);
Check.NotNull(resultProperty, nameof(resultProperty));
return resultProperty.GetValue(task);
return resultProperty!.GetValue(task)!;
}
}

2
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Proxying/HttpActionParameterHelper.cs

@ -6,7 +6,7 @@ namespace Volo.Abp.Http.Client.Proxying;
internal static class HttpActionParameterHelper
{
public static object FindParameterValue(IReadOnlyDictionary<string, object> methodArguments, ParameterApiDescriptionModel apiParameter)
public static object? FindParameterValue(IReadOnlyDictionary<string, object> methodArguments, ParameterApiDescriptionModel apiParameter)
{
var value = methodArguments.GetOrDefault(apiParameter.NameOnMethod);
if (value == null)

Loading…
Cancel
Save