From 687388df5d9c0927a6c17a20a09907f465fc677d Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 19 Jul 2024 09:30:59 +0200 Subject: [PATCH] =?UTF-8?q?Update=20modalit=C3=A0=20confronto=20dati=20con?= =?UTF-8?q?f?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MP.AppAuth/AppAuthContext.cs | 6 +- MP.AppAuth/Controllers/AppAuthController.cs | 4 +- MP.AppAuth/Controllers/MPController .cs | 6 +- .../{Vocabolario.cs => VocabolarioModel.cs} | 2 +- MP.AppAuth/MoonProContext.cs | 6 +- MP.Land/Components/CompareAnagKeyVal.razor | 18 +- MP.Land/Components/CompareAnagKeyVal.razor.cs | 24 +++ MP.Land/Components/CompareConfig.razor | 19 +- MP.Land/Components/CompareConfig.razor.cs | 24 +++ MP.Land/Components/CompareVocabolario.razor | 19 +- .../Components/CompareVocabolario.razor.cs | 24 +++ MP.Land/Data/AppAuthService.cs | 6 +- MP.Land/Data/SyncService.cs | 163 ++++++++++++++++ MP.Land/MP.Land.csproj | 2 +- MP.Land/Pages/ConfSync.razor | 43 ++-- MP.Land/Pages/ConfSync.razor.cs | 183 ++++++++++-------- MP.Land/Resources/ChangeLog.html | 2 +- MP.Land/Resources/VersNum.txt | 2 +- MP.Land/Resources/manifest.xml | 2 +- MP.Land/Startup.cs | 1 + 20 files changed, 415 insertions(+), 141 deletions(-) rename MP.AppAuth/Models/{Vocabolario.cs => VocabolarioModel.cs} (91%) create mode 100644 MP.Land/Components/CompareAnagKeyVal.razor.cs create mode 100644 MP.Land/Components/CompareConfig.razor.cs create mode 100644 MP.Land/Components/CompareVocabolario.razor.cs create mode 100644 MP.Land/Data/SyncService.cs diff --git a/MP.AppAuth/AppAuthContext.cs b/MP.AppAuth/AppAuthContext.cs index 16c3cabe..4ea914e2 100644 --- a/MP.AppAuth/AppAuthContext.cs +++ b/MP.AppAuth/AppAuthContext.cs @@ -58,7 +58,7 @@ namespace MP.AppAuth public virtual DbSet DbSetAnagOpr { get; set; } public virtual DbSet DbSetGruppi2Oper { get; set; } public virtual DbSet DbSetUpdMan { get; set; } - public virtual DbSet DbSetVocabolario { get; set; } + public virtual DbSet DbSetVocabolario { get; set; } #endregion Public Properties @@ -90,12 +90,10 @@ namespace MP.AppAuth { modelBuilder.HasAnnotation("Relational:Collation", "SQL_Latin1_General_CP1_CI_AS"); - modelBuilder.Entity(entity => + modelBuilder.Entity(entity => { entity.HasKey(e => new { e.Lingua, e.Lemma }); - entity.ToTable("Vocabolario"); - entity.Property(e => e.Lingua).HasMaxLength(3); entity.Property(e => e.Lemma).HasMaxLength(50); diff --git a/MP.AppAuth/Controllers/AppAuthController.cs b/MP.AppAuth/Controllers/AppAuthController.cs index 03b2c650..d0fce9ae 100644 --- a/MP.AppAuth/Controllers/AppAuthController.cs +++ b/MP.AppAuth/Controllers/AppAuthController.cs @@ -177,9 +177,9 @@ namespace MP.AppAuth.Controllers /// Elenco Record x gestione Update /// /// - public List VocabolarioGetAll() + public List VocabolarioGetAll() { - List dbResult = new List(); + List dbResult = new List(); using (AppAuthContext localDbCtx = new AppAuthContext(_configuration)) { dbResult = localDbCtx diff --git a/MP.AppAuth/Controllers/MPController .cs b/MP.AppAuth/Controllers/MPController .cs index 66fb1868..6245b06a 100644 --- a/MP.AppAuth/Controllers/MPController .cs +++ b/MP.AppAuth/Controllers/MPController .cs @@ -69,12 +69,12 @@ namespace MP.AppAuth.Controllers } /// - /// Elenco Record x Vocabolario + /// Elenco Record x VocabolarioModel /// /// - public List VocabolarioGetAll() + public List VocabolarioGetAll() { - List dbResult = new List(); + List dbResult = new List(); using (MoonProContext localDbCtx = new MoonProContext(_configuration)) { dbResult = localDbCtx diff --git a/MP.AppAuth/Models/Vocabolario.cs b/MP.AppAuth/Models/VocabolarioModel.cs similarity index 91% rename from MP.AppAuth/Models/Vocabolario.cs rename to MP.AppAuth/Models/VocabolarioModel.cs index 4e48b850..18dd28da 100644 --- a/MP.AppAuth/Models/Vocabolario.cs +++ b/MP.AppAuth/Models/VocabolarioModel.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace MP.AppAuth.Models { [Table("Vocabolario")] - public partial class Vocabolario + public partial class VocabolarioModel { #region Public Properties diff --git a/MP.AppAuth/MoonProContext.cs b/MP.AppAuth/MoonProContext.cs index 7f99d0b8..22280dac 100644 --- a/MP.AppAuth/MoonProContext.cs +++ b/MP.AppAuth/MoonProContext.cs @@ -71,7 +71,7 @@ namespace MP.AppAuth public virtual DbSet ListValues { get; set; } public virtual DbSet Macchines { get; set; } public virtual DbSet UpdMan { get; set; } - public virtual DbSet DbSetVocabolario { get; set; } + public virtual DbSet DbSetVocabolario { get; set; } #endregion Public Properties @@ -488,12 +488,10 @@ namespace MP.AppAuth .HasDefaultValueSql("('')"); }); - modelBuilder.Entity(entity => + modelBuilder.Entity(entity => { entity.HasKey(e => new { e.Lingua, e.Lemma }); - entity.ToTable("Vocabolario"); - entity.Property(e => e.Lingua).HasMaxLength(3); entity.Property(e => e.Lemma).HasMaxLength(50); diff --git a/MP.Land/Components/CompareAnagKeyVal.razor b/MP.Land/Components/CompareAnagKeyVal.razor index 918fa73a..19acc1b6 100644 --- a/MP.Land/Components/CompareAnagKeyVal.razor +++ b/MP.Land/Components/CompareAnagKeyVal.razor @@ -1,5 +1,19 @@ 

CompareAnagKeyVal

-@code { -} +
+
+ # rec Locali +
+
+ @numLoc +
+
+
+
+ # rec Remoti +
+
+ @numRem +
+
\ No newline at end of file diff --git a/MP.Land/Components/CompareAnagKeyVal.razor.cs b/MP.Land/Components/CompareAnagKeyVal.razor.cs new file mode 100644 index 00000000..72ceafde --- /dev/null +++ b/MP.Land/Components/CompareAnagKeyVal.razor.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNetCore.Components; +using MP.AppAuth.Models; +using System.Collections.Generic; + +namespace MP.Land.Components +{ + public partial class CompareAnagKeyVal + { + [Parameter] + public List ListAnagKeyValLoc { get; set; } = new List(); + + [Parameter] + public List ListAnagKeyValRem { get; set; } = new List(); + + protected override void OnParametersSet() + { + numLoc = ListAnagKeyValLoc != null ? ListAnagKeyValLoc.Count : 0; + numRem = ListAnagKeyValRem != null ? ListAnagKeyValRem.Count : 0; + } + + protected int numLoc { get; set; } = 0; + protected int numRem { get; set; } = 0; + } +} \ No newline at end of file diff --git a/MP.Land/Components/CompareConfig.razor b/MP.Land/Components/CompareConfig.razor index dbadb4f1..81fc464b 100644 --- a/MP.Land/Components/CompareConfig.razor +++ b/MP.Land/Components/CompareConfig.razor @@ -1,5 +1,18 @@ 

CompareConfig

-@code { - -} +
+
+ # rec Locali +
+
+ @numLoc +
+
+
+
+ # rec Remoti +
+
+ @numRem +
+
diff --git a/MP.Land/Components/CompareConfig.razor.cs b/MP.Land/Components/CompareConfig.razor.cs new file mode 100644 index 00000000..25bb453a --- /dev/null +++ b/MP.Land/Components/CompareConfig.razor.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNetCore.Components; +using MP.AppAuth.Models; +using System.Collections.Generic; + +namespace MP.Land.Components +{ + public partial class CompareConfig + { + [Parameter] + public List ListConfigLoc { get; set; } = new List(); + + [Parameter] + public List ListConfigRem { get; set; } = new List(); + + protected override void OnParametersSet() + { + numLoc = ListConfigLoc != null ? ListConfigLoc.Count : 0; + numRem = ListConfigRem != null ? ListConfigRem.Count : 0; + } + + protected int numLoc { get; set; } = 0; + protected int numRem { get; set; } = 0; + } +} \ No newline at end of file diff --git a/MP.Land/Components/CompareVocabolario.razor b/MP.Land/Components/CompareVocabolario.razor index 52c03f5b..b1a89ce2 100644 --- a/MP.Land/Components/CompareVocabolario.razor +++ b/MP.Land/Components/CompareVocabolario.razor @@ -1,5 +1,18 @@ 

CompareVocabolario

-@code { - -} +
+
+ # rec Locali +
+
+ @numLoc +
+
+
+
+ # rec Remoti +
+
+ @numRem +
+
diff --git a/MP.Land/Components/CompareVocabolario.razor.cs b/MP.Land/Components/CompareVocabolario.razor.cs new file mode 100644 index 00000000..9fd5555d --- /dev/null +++ b/MP.Land/Components/CompareVocabolario.razor.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNetCore.Components; +using MP.AppAuth.Models; +using System.Collections.Generic; + +namespace MP.Land.Components +{ + public partial class CompareVocabolario + { + [Parameter] + public List ListVocabolarioLoc { get; set; } = new List(); + + [Parameter] + public List ListVocabolarioRem { get; set; } = new List(); + + protected override void OnParametersSet() + { + numLoc = ListVocabolarioLoc != null ? ListVocabolarioLoc.Count : 0; + numRem = ListVocabolarioRem != null ? ListVocabolarioRem.Count : 0; + } + + protected int numLoc { get; set; } = 0; + protected int numRem { get; set; } = 0; + } +} \ No newline at end of file diff --git a/MP.Land/Data/AppAuthService.cs b/MP.Land/Data/AppAuthService.cs index 2b966a89..f533d564 100644 --- a/MP.Land/Data/AppAuthService.cs +++ b/MP.Land/Data/AppAuthService.cs @@ -169,9 +169,9 @@ namespace MP.Land.Data return await Task.FromResult(dbResult); } - public async Task> VocabolarioList() + public async Task> VocabolarioList() { - List dbResult = new List(); + List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = MpDbController.VocabolarioGetAll(); @@ -207,7 +207,7 @@ namespace MP.Land.Data distributedCache.Set(cacheKey, redisDataList, cacheOptLong); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; - Log.Trace($"Effettuato rilettura da DB + caching per Vocabolario: {ts.TotalMilliseconds} ms"); + Log.Trace($"Effettuato rilettura da DB + caching per VocabolarioModel: {ts.TotalMilliseconds} ms"); } } } diff --git a/MP.Land/Data/SyncService.cs b/MP.Land/Data/SyncService.cs new file mode 100644 index 00000000..aa22bf70 --- /dev/null +++ b/MP.Land/Data/SyncService.cs @@ -0,0 +1,163 @@ +using Egw.Core; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using MP.AppAuth.Models; +using Newtonsoft.Json; +using RestSharp; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Web; +using static System.Net.Mime.MediaTypeNames; + +namespace MP.Land.Data +{ + public class SyncService + { + /// + /// Init classe + /// + /// + /// + public SyncService(IConfiguration configuration, ILogger logger) + { + _logger = logger; + _configuration = configuration; + } + + private static ILogger _logger { get; set; } = null!; + private static IConfiguration? _configuration; + + /// + /// URL dell'API x chiamate gestione licenze + /// + private static string apiUrl = "https://liman.egalware.com/ELM.API/"; + + /// + /// Stato server gestione licenze + /// + public async Task checkLimanServer() + { + string answ = "ND"; + // cerco online + RestClient client = new RestClient(apiUrl); + var request = new RestRequest($"api/health", Method.Get); + var response = await client.GetAsync(request); + // controllo risposta + if (response.StatusCode == System.Net.HttpStatusCode.OK) + { + // verifico risposta + if (response.Content != null) + { + answ = response.Content.Replace("\"", ""); + } + } + return await Task.FromResult(answ); + } + public List AKVList { get; set; } = new List(); + public string Applicazione { get; set; } = ""; + /// + /// Codice cliente/installazione + /// + public string Installazione { get; set; } = ""; + /// + /// Cerca di recuperare valore string da elenco AKV + /// + /// Chiave AKV richiesta + /// + protected string getAVKStr(string varReq) + { + string answ = ""; + if (AKVList != null && AKVList.Count > 0) + { + var currRec = AKVList.Where(x => x.NomeVar == varReq).FirstOrDefault(); + if (currRec != null) + { + answ = $"{currRec.ValString}"; + } + } + return answ; + } + /// + /// Init della classe con variabili di base da Redis/DB + /// + public bool InitAkv() + { + bool fatto = false; + Applicazione = "MAPO"; + Installazione = getAVKStr("Installazione"); + MasterKey = getAVKStr(Applicazione); + fatto = !string.IsNullOrEmpty($"{Installazione}{MasterKey}"); + return fatto; + } + + /// + /// Master key licenza principale + /// + public string MasterKey { get; set; } = ""; + + /// + /// Lista record AnagKeyVal + /// + public async Task?> OnlineListAnagKeyVal() + { + List? answ = new List(); + // cerco online + RestClient client = new RestClient(apiUrl); + string MKeyEnc = HttpUtility.UrlEncode(MasterKey); + var request = new RestRequest($"api/dbsync/anagkeyval/{Installazione}?CodApp={Applicazione}", Method.Get); + var response = await client.GetAsync(request); + // controllo risposta + if (response.StatusCode == System.Net.HttpStatusCode.OK) + { + // salvo in redis contenuto serializzato + string rawData = $"{response.Content}"; + answ = JsonConvert.DeserializeObject?>(rawData); + } + return await Task.FromResult(answ); + } + + /// + /// Lista record Config + /// + public async Task?> OnlineListConfig() + { + List? answ = new List(); + // cerco online + RestClient client = new RestClient(apiUrl); + string MKeyEnc = HttpUtility.UrlEncode(MasterKey); + var request = new RestRequest($"api/dbsync/conf/{Installazione}?CodApp={Applicazione}", Method.Get); + var response = await client.GetAsync(request); + // controllo risposta + if (response.StatusCode == System.Net.HttpStatusCode.OK) + { + // salvo in redis contenuto serializzato + string rawData = $"{response.Content}"; + answ = JsonConvert.DeserializeObject?>(rawData); + } + return await Task.FromResult(answ); + } + + /// + /// Lista record Vocabolario + /// + public async Task?> OnlineListVocabolario() + { + List? answ = new List(); + // cerco online + RestClient client = new RestClient(apiUrl); + string MKeyEnc = HttpUtility.UrlEncode(MasterKey); + var request = new RestRequest($"api/dbsync/vocabolario/{Installazione}?CodApp={Applicazione}", Method.Get); + var response = await client.GetAsync(request); + // controllo risposta + if (response.StatusCode == System.Net.HttpStatusCode.OK) + { + // salvo in redis contenuto serializzato + string rawData = $"{response.Content}"; + answ = JsonConvert.DeserializeObject?>(rawData); + } + return await Task.FromResult(answ); + } + } +} diff --git a/MP.Land/MP.Land.csproj b/MP.Land/MP.Land.csproj index 9a0e9d39..1f422033 100644 --- a/MP.Land/MP.Land.csproj +++ b/MP.Land/MP.Land.csproj @@ -3,7 +3,7 @@ net6.0 MP.Land - 6.16.2407.1819 + 6.16.2407.1909 diff --git a/MP.Land/Pages/ConfSync.razor b/MP.Land/Pages/ConfSync.razor index b5650add..30054246 100644 --- a/MP.Land/Pages/ConfSync.razor +++ b/MP.Land/Pages/ConfSync.razor @@ -1,4 +1,5 @@ @page "/ConfSync" +
@@ -15,57 +16,35 @@
Aggiorna
- +
@if (showUpdate) { -
- -
-
- @outMessages -
-
- @if (showProgress) - { -
-
-
- } -
-
-
- + }
- @if (isLoading) + @if (isLoadingLoc) { - + } - @* else if (totalCount == 0) + else if (isLoadingRem) { -
Nessun record trovato
- } *@ + + } else {
- @* @foreach (var item in ListRecords) - { -
- -
- } *@
- +
- +
- +
} diff --git a/MP.Land/Pages/ConfSync.razor.cs b/MP.Land/Pages/ConfSync.razor.cs index 94bf26d3..1f6a590f 100644 --- a/MP.Land/Pages/ConfSync.razor.cs +++ b/MP.Land/Pages/ConfSync.razor.cs @@ -5,8 +5,6 @@ using MP.AppAuth.Models; using MP.Land.Data; using System; using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; using System.Threading.Tasks; namespace MP.Land.Pages @@ -17,12 +15,12 @@ namespace MP.Land.Pages public void Dispose() { - ListAnagKeyValLoc = null; - ListConfigLoc = null; - ListVocabolarioLoc = null; - ListAnagKeyValRem = null; - ListConfigRem = null; - ListVocabolarioRem = null; + listAnagKeyValLoc = null; + listConfigLoc = null; + listVocabolarioLoc = null; + listAnagKeyValRem = null; + listConfigRem = null; + listVocabolarioRem = null; GC.Collect(); } @@ -39,6 +37,19 @@ namespace MP.Land.Pages #region Protected Properties + protected List AKVList + { + get + { + return SyncServ.AKVList; + } + + set + { + SyncServ.AKVList = value; + } + } + [Inject] protected MessageService AppMService { get; set; } @@ -48,68 +59,22 @@ namespace MP.Land.Pages [Inject] protected AppAuthService DataService { get; set; } + protected bool isLoadingLoc { get; set; } = false; + + protected bool isLoadingRem { get; set; } = false; + [Inject] protected LicenseService LicServ { get; set; } = null!; - protected string outMessages { get; set; } = ""; - protected int percLoading { get; set; } = 0; - protected bool showProgress { get; set; } = false; protected bool showUpdate { get; set; } = false; - protected bool isLoading { get; set; } = false; + + [Inject] + protected SyncService SyncServ { get; set; } = null!; #endregion Protected Properties #region Protected Methods - /// - /// Cicla su tutti i record ed effettua il download - /// - protected async Task RefreshData() - { - // init progress... - showProgress = true; - showUpdate = true; -#if false - outMessages = $"Iniziato download per {numTot} packages"; - StateHasChanged(); - percLoading = 0; - TotalMb = 0; - numDone = 0; - Stopwatch stopWatch = new Stopwatch(); - stopWatch.Start(); - // ciclo su tutti quelli con licenza valida... - List rawList = ListRecords - .Where(x => !string.IsNullOrEmpty(x.LicenseKey)).ToList(); - List authList = new List(); - - // ciclo SOLO tra quelli davvero autorizzati... - foreach (var item in rawList) - { - if (LicServ.checkLicenseActive(item.LicenseKey)) - { - authList.Add(item); - } - } - numTot = authList.Count; - foreach (var item in authList) - { - long size = 0; - size = await scaricaSingolo(item); - TotalMb += (double)size / (1024 * 1024); - outMessages = $"Scaricati {numDone}/{numTot} packages | {TotalMb:N2} Mb"; - StateHasChanged(); - await Task.Delay(1); - } - stopWatch.Stop(); - TimeSpan ts = stopWatch.Elapsed; - outMessages = $"Effettuato download di {numDone} update | {TotalMb:N2} Mb in {ts.TotalSeconds:N2} s"; - StateHasChanged(); -#endif - await Task.Delay(1000); - showProgress = false; - StateHasChanged(); - } - protected string localPath(string localRepo) { return @$"{Configuration["ServerConf:downloadPath"]}\{localRepo}\{Configuration["appVers"]}"; ; @@ -120,38 +85,95 @@ namespace MP.Land.Pages AppMService.ShowSearch = false; AppMService.PageName = "Config Sync"; AppMService.PageIcon = "fas fa-file-import pr-2"; - await ReloadData(); + await RefreshData(); } - protected async Task ReloadData() + /// + /// Cicla su tutti i record ed effettua il download + /// + protected async Task RefreshData() { - isLoading = true; - await Task.Delay(1); - ListAnagKeyValLoc = await DataService.AnagKeyValList(); - await Task.Delay(1); - ListConfigLoc = await DataService.ConfigList(); - await Task.Delay(1); - ListVocabolarioLoc = await DataService.VocabolarioList(); - isLoading = false; + // init progress... + showUpdate = true; + numDone = 0; + numTot = 3; + await fixAKV(); + numDone++; + await InvokeAsync(StateHasChanged); + await ReloadDataLoc(); + numDone++; + await InvokeAsync(StateHasChanged); + await ReloadDataRem(); + numDone++; + await InvokeAsync(StateHasChanged); + await Task.Delay(1000); + showUpdate = false; + await InvokeAsync(StateHasChanged); + } + + protected async Task ReloadDataLoc() + { + isLoadingLoc = true; + await InvokeAsync(StateHasChanged); + await Task.Delay(tDelay); + listAnagKeyValLoc = await DataService.AnagKeyValList(); + await Task.Delay(tDelay); + listConfigLoc = await DataService.ConfigList(); + await Task.Delay(tDelay); + listVocabolarioLoc = await DataService.VocabolarioList(); + isLoadingLoc = false; + } + + protected async Task ReloadDataRem() + { + isLoadingRem = true; + await InvokeAsync(StateHasChanged); + await Task.Delay(tDelay); + listAnagKeyValRem = await SyncServ.OnlineListAnagKeyVal(); + await Task.Delay(tDelay); + listConfigRem = await SyncServ.OnlineListConfig(); + await Task.Delay(tDelay); + listVocabolarioRem = await SyncServ.OnlineListVocabolario(); + isLoadingRem = false; } #endregion Protected Methods #region Private Fields - - private List ListAnagKeyValLoc { get; set; } = new List(); - private List ListConfigLoc { get; set; } = new List(); - private List ListVocabolarioLoc { get; set; } = new List(); - - private List ListAnagKeyValRem { get; set; } = new List(); - private List ListConfigRem { get; set; } = new List(); - private List ListVocabolarioRem { get; set; } = new List(); + private int tDelay = 250; #endregion Private Fields + #region Private Properties + + private List listAnagKeyValLoc { get; set; } = new List(); + + private List listAnagKeyValRem { get; set; } = new List(); + + private List listConfigLoc { get; set; } = new List(); + + private List listConfigRem { get; set; } = new List(); + + private List listVocabolarioLoc { get; set; } = new List(); + + private List listVocabolarioRem { get; set; } = new List(); + + #endregion Private Properties + #region Private Methods + private async Task fixAKV() + { + // check init AKV + if (AKVList == null || AKVList.Count == 0) + { + AKVList = await DataService.AnagKeyValList(); + SyncServ.InitAkv(); + } + } + +#if false private async Task scaricaSingolo(UpdMan item) { long size = 0; @@ -166,7 +188,8 @@ namespace MP.Land.Pages numDone++; percLoading = 100 * numDone / numTot; return await Task.FromResult(size); - } + } +#endif #endregion Private Methods } diff --git a/MP.Land/Resources/ChangeLog.html b/MP.Land/Resources/ChangeLog.html index b8f14feb..35acae96 100644 --- a/MP.Land/Resources/ChangeLog.html +++ b/MP.Land/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo Tablet MAPO - DotNet6 -

Versione: 6.16.2407.1819

+

Versione: 6.16.2407.1909


Note di rilascio:
    diff --git a/MP.Land/Resources/VersNum.txt b/MP.Land/Resources/VersNum.txt index 799ff6e0..c1648f33 100644 --- a/MP.Land/Resources/VersNum.txt +++ b/MP.Land/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2407.1819 +6.16.2407.1909 diff --git a/MP.Land/Resources/manifest.xml b/MP.Land/Resources/manifest.xml index b45f6295..f89247b1 100644 --- a/MP.Land/Resources/manifest.xml +++ b/MP.Land/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2407.1819 + 6.16.2407.1909 https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/MP.Land.zip https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/ChangeLog.html false diff --git a/MP.Land/Startup.cs b/MP.Land/Startup.cs index e8f91d80..107e64f2 100644 --- a/MP.Land/Startup.cs +++ b/MP.Land/Startup.cs @@ -129,6 +129,7 @@ namespace MP.Land services.AddSingleton(Configuration); services.AddSingleton(); + services.AddSingleton(); services.AddScoped(); services.AddScoped();