-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Configure CleanArchitecture Services
- Loading branch information
Showing
16 changed files
with
786 additions
and
18 deletions.
There are no files selected for viewing
306 changes: 306 additions & 0 deletions
306
src/content/CleanArchitecture.Maui/src/MobileUi/WebApi/ApiClients.g.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,306 @@ | ||
//---------------------- | ||
// <auto-generated> | ||
// Generated using the NSwag toolchain v14.0.2.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org) | ||
// </auto-generated> | ||
//---------------------- | ||
|
||
using Microsoft.AspNetCore.Mvc; | ||
using CleanArchitecture.Maui.MobileUi.Shared.TodoItems; | ||
using CleanArchitecture.Maui.MobileUi.Shared.TodoLists; | ||
using CleanArchitecture.Maui.MobileUi.Shared.WeatherForecasts; | ||
using CleanArchitecture.Maui.MobileUi.Shared.AccessControl; | ||
|
||
#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." | ||
#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." | ||
#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' | ||
#pragma warning disable 612 // Disable "CS0612 '...' is obsolete" | ||
#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... | ||
#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." | ||
#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'" | ||
#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant" | ||
#pragma warning disable 8603 // Disable "CS8603 Possible null reference return" | ||
#pragma warning disable 8604 // Disable "CS8604 Possible null reference argument for parameter" | ||
#pragma warning disable 8625 // Disable "CS8625 Cannot convert null literal to non-nullable reference type" | ||
|
||
namespace CleanArchitecture.Maui.MobileUi.Client | ||
{ | ||
using System = global::System; | ||
|
||
[System.CodeDom.Compiler.GeneratedCode("NSwag", "14.0.2.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0))")] | ||
public partial interface IClient | ||
{ | ||
/// <exception cref="ApiException">A server side error occurred.</exception> | ||
System.Threading.Tasks.Task<System.Collections.Generic.ICollection<WeatherForecast>> CleanArchitectureMauiMobileUiWebApiEndpointsWeatherForecastEndpointAsync(); | ||
|
||
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> | ||
/// <exception cref="ApiException">A server side error occurred.</exception> | ||
System.Threading.Tasks.Task<System.Collections.Generic.ICollection<WeatherForecast>> CleanArchitectureMauiMobileUiWebApiEndpointsWeatherForecastEndpointAsync(System.Threading.CancellationToken cancellationToken); | ||
|
||
} | ||
|
||
[System.CodeDom.Compiler.GeneratedCode("NSwag", "14.0.2.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0))")] | ||
public partial class Client : IClient | ||
{ | ||
private System.Net.Http.HttpClient _httpClient; | ||
private static System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings = new System.Lazy<Newtonsoft.Json.JsonSerializerSettings>(CreateSerializerSettings, true); | ||
|
||
public Client(System.Net.Http.HttpClient httpClient) | ||
{ | ||
_httpClient = httpClient; | ||
} | ||
|
||
private static Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() | ||
{ | ||
var settings = new Newtonsoft.Json.JsonSerializerSettings(); | ||
UpdateJsonSerializerSettings(settings); | ||
return settings; | ||
} | ||
|
||
protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } | ||
|
||
static partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); | ||
|
||
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); | ||
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); | ||
partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); | ||
|
||
/// <exception cref="ApiException">A server side error occurred.</exception> | ||
public virtual System.Threading.Tasks.Task<System.Collections.Generic.ICollection<WeatherForecast>> CleanArchitectureMauiMobileUiWebApiEndpointsWeatherForecastEndpointAsync() | ||
{ | ||
return CleanArchitectureMauiMobileUiWebApiEndpointsWeatherForecastEndpointAsync(System.Threading.CancellationToken.None); | ||
} | ||
|
||
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> | ||
/// <exception cref="ApiException">A server side error occurred.</exception> | ||
public virtual async System.Threading.Tasks.Task<System.Collections.Generic.ICollection<WeatherForecast>> CleanArchitectureMauiMobileUiWebApiEndpointsWeatherForecastEndpointAsync(System.Threading.CancellationToken cancellationToken) | ||
{ | ||
var client_ = _httpClient; | ||
var disposeClient_ = false; | ||
try | ||
{ | ||
using (var request_ = new System.Net.Http.HttpRequestMessage()) | ||
{ | ||
request_.Method = new System.Net.Http.HttpMethod("GET"); | ||
request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); | ||
|
||
var urlBuilder_ = new System.Text.StringBuilder(); | ||
|
||
// Operation Path: "weatherforecast" | ||
urlBuilder_.Append("weatherforecast"); | ||
|
||
PrepareRequest(client_, request_, urlBuilder_); | ||
|
||
var url_ = urlBuilder_.ToString(); | ||
request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); | ||
|
||
PrepareRequest(client_, request_, url_); | ||
|
||
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); | ||
var disposeResponse_ = true; | ||
try | ||
{ | ||
var headers_ = new System.Collections.Generic.Dictionary<string, System.Collections.Generic.IEnumerable<string>>(); | ||
foreach (var item_ in response_.Headers) | ||
headers_[item_.Key] = item_.Value; | ||
if (response_.Content != null && response_.Content.Headers != null) | ||
{ | ||
foreach (var item_ in response_.Content.Headers) | ||
headers_[item_.Key] = item_.Value; | ||
} | ||
|
||
ProcessResponse(client_, response_); | ||
|
||
var status_ = (int)response_.StatusCode; | ||
if (status_ == 200) | ||
{ | ||
var objectResponse_ = await ReadObjectResponseAsync<System.Collections.Generic.ICollection<WeatherForecast>>(response_, headers_, cancellationToken).ConfigureAwait(false); | ||
if (objectResponse_.Object == null) | ||
{ | ||
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||
} | ||
return objectResponse_.Object; | ||
} | ||
else | ||
{ | ||
var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); | ||
throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); | ||
} | ||
} | ||
finally | ||
{ | ||
if (disposeResponse_) | ||
response_.Dispose(); | ||
} | ||
} | ||
} | ||
finally | ||
{ | ||
if (disposeClient_) | ||
client_.Dispose(); | ||
} | ||
} | ||
|
||
protected struct ObjectResponseResult<T> | ||
{ | ||
public ObjectResponseResult(T responseObject, string responseText) | ||
{ | ||
this.Object = responseObject; | ||
this.Text = responseText; | ||
} | ||
|
||
public T Object { get; } | ||
|
||
public string Text { get; } | ||
} | ||
|
||
public bool ReadResponseAsString { get; set; } | ||
|
||
protected virtual async System.Threading.Tasks.Task<ObjectResponseResult<T>> ReadObjectResponseAsync<T>(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Threading.CancellationToken cancellationToken) | ||
{ | ||
if (response == null || response.Content == null) | ||
{ | ||
return new ObjectResponseResult<T>(default(T), string.Empty); | ||
} | ||
|
||
if (ReadResponseAsString) | ||
{ | ||
var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); | ||
try | ||
{ | ||
var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseText, JsonSerializerSettings); | ||
return new ObjectResponseResult<T>(typedBody, responseText); | ||
} | ||
catch (Newtonsoft.Json.JsonException exception) | ||
{ | ||
var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; | ||
throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); | ||
} | ||
} | ||
else | ||
{ | ||
try | ||
{ | ||
using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) | ||
using (var streamReader = new System.IO.StreamReader(responseStream)) | ||
using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) | ||
{ | ||
var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); | ||
var typedBody = serializer.Deserialize<T>(jsonTextReader); | ||
return new ObjectResponseResult<T>(typedBody, string.Empty); | ||
} | ||
} | ||
catch (Newtonsoft.Json.JsonException exception) | ||
{ | ||
var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; | ||
throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); | ||
} | ||
} | ||
} | ||
|
||
private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) | ||
{ | ||
if (value == null) | ||
{ | ||
return ""; | ||
} | ||
|
||
if (value is System.Enum) | ||
{ | ||
var name = System.Enum.GetName(value.GetType(), value); | ||
if (name != null) | ||
{ | ||
var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); | ||
if (field != null) | ||
{ | ||
var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) | ||
as System.Runtime.Serialization.EnumMemberAttribute; | ||
if (attribute != null) | ||
{ | ||
return attribute.Value != null ? attribute.Value : name; | ||
} | ||
} | ||
|
||
var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); | ||
return converted == null ? string.Empty : converted; | ||
} | ||
} | ||
else if (value is bool) | ||
{ | ||
return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); | ||
} | ||
else if (value is byte[]) | ||
{ | ||
return System.Convert.ToBase64String((byte[]) value); | ||
} | ||
else if (value is string[]) | ||
{ | ||
return string.Join(",", (string[])value); | ||
} | ||
else if (value.GetType().IsArray) | ||
{ | ||
var valueArray = (System.Array)value; | ||
var valueTextArray = new string[valueArray.Length]; | ||
for (var i = 0; i < valueArray.Length; i++) | ||
{ | ||
valueTextArray[i] = ConvertToString(valueArray.GetValue(i), cultureInfo); | ||
} | ||
return string.Join(",", valueTextArray); | ||
} | ||
|
||
var result = System.Convert.ToString(value, cultureInfo); | ||
return result == null ? "" : result; | ||
} | ||
} | ||
|
||
|
||
|
||
|
||
|
||
[System.CodeDom.Compiler.GeneratedCode("NSwag", "14.0.2.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0))")] | ||
public partial class ApiException : System.Exception | ||
{ | ||
public int StatusCode { get; private set; } | ||
|
||
public string Response { get; private set; } | ||
|
||
public System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> Headers { get; private set; } | ||
|
||
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Exception innerException) | ||
: base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException) | ||
{ | ||
StatusCode = statusCode; | ||
Response = response; | ||
Headers = headers; | ||
} | ||
|
||
public override string ToString() | ||
{ | ||
return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString()); | ||
} | ||
} | ||
|
||
[System.CodeDom.Compiler.GeneratedCode("NSwag", "14.0.2.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0))")] | ||
public partial class ApiException<TResult> : ApiException | ||
{ | ||
public TResult Result { get; private set; } | ||
|
||
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, TResult result, System.Exception innerException) | ||
: base(message, statusCode, response, headers, innerException) | ||
{ | ||
Result = result; | ||
} | ||
} | ||
|
||
} | ||
|
||
#pragma warning restore 108 | ||
#pragma warning restore 114 | ||
#pragma warning restore 472 | ||
#pragma warning restore 612 | ||
#pragma warning restore 1573 | ||
#pragma warning restore 1591 | ||
#pragma warning restore 8073 | ||
#pragma warning restore 3016 | ||
#pragma warning restore 8603 | ||
#pragma warning restore 8604 | ||
#pragma warning restore 8625 |
44 changes: 44 additions & 0 deletions
44
...eanArchitecture.Maui/src/MobileUi/WebApi/DependencyInjection/ApplicationConfigurations.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
namespace CleanArchitecture.Maui.MobileUi.WebApi.DependencyInjection; | ||
|
||
public static class ApplicationConfigurations | ||
{ | ||
public static void RegisterCleanArchitectureServices(this WebApplicationBuilder builder) | ||
{ | ||
var installerType = typeof(IServiceInstaller); | ||
|
||
var installers = installerType | ||
.Assembly.ExportedTypes | ||
.Where(t => | ||
{ | ||
var isAssignable = installerType.IsAssignableFrom(t); | ||
var concreteType = t is { IsInterface: false, IsAbstract: false }; | ||
return isAssignable && concreteType; | ||
}) | ||
.Select(Activator.CreateInstance) | ||
.Cast<IServiceInstaller>(); | ||
foreach (var installer in installers) | ||
{ | ||
installer.InstallerService(builder.Services,builder.Configuration); | ||
} | ||
} | ||
|
||
public static void UseCleanArchitectureMiddleware(this WebApplication app) | ||
{ | ||
var installerType = typeof(IMiddlewareInstaller); | ||
|
||
var installers = installerType | ||
.Assembly.ExportedTypes | ||
.Where(t => | ||
{ | ||
var isAssignable = installerType.IsAssignableFrom(t); | ||
var concreteType = t is { IsInterface: false, IsAbstract: false }; | ||
return isAssignable && concreteType; | ||
}) | ||
.Select(Activator.CreateInstance) | ||
.Cast<IMiddlewareInstaller>(); | ||
foreach (var installer in installers) | ||
{ | ||
installer.InstallMiddleWare(app); | ||
} | ||
} | ||
} |
29 changes: 29 additions & 0 deletions
29
...content/CleanArchitecture.Maui/src/MobileUi/WebApi/DependencyInjection/AspCoreServices.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
namespace CleanArchitecture.Maui.MobileUi.WebApi.DependencyInjection; | ||
|
||
public sealed class AspCoreServices : IServiceInstaller, IMiddlewareInstaller | ||
{ | ||
public void InstallerService(IServiceCollection services, IConfiguration configuration) | ||
{ | ||
services.AddEndpointsApiExplorer(); | ||
services.AddAntiforgery(); | ||
} | ||
|
||
public void InstallMiddleWare(WebApplication app) | ||
{ | ||
if (app.Environment.IsDevelopment()) | ||
{ | ||
app.UseMigrationsEndPoint(); | ||
} | ||
else | ||
{ | ||
app.UseExceptionHandler("/Error", createScopeForErrors: true); | ||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. | ||
app.UseHsts(); | ||
} | ||
|
||
app.UseHttpsRedirection(); | ||
|
||
app.UseStaticFiles(); | ||
app.UseAntiforgery(); | ||
} | ||
} |
Oops, something went wrong.