improvements, fixes, etc...

This commit is contained in:
Loretta 2025-09-29 13:33:39 +02:00
parent 32c37cf22c
commit 08f91408c3
5 changed files with 126 additions and 11 deletions

View File

@ -1,6 +1,17 @@
namespace Mango.Nop.Core.Interfaces;
using Mango.Nop.Core.Loggers;
using Nop.Data;
using System.Transactions;
namespace Mango.Nop.Core.Interfaces;
public interface IMgDbContextBase //: IAcDbContextBase
{
ILogger Logger { get; init; }
INopDataProvider DataProvider { get; init; }
bool Transaction(Func<TransactionScope, bool> callbackTransactionBody, bool throwException = false);
bool TransactionSafe(Func<TransactionScope, bool> callbackTransactionBody, bool throwException = false);
Task<bool> TransactionAsync(Func<TransactionScope, Task<bool>> callbackTransactionBody, bool throwException = false);
Task<bool> TransactionSafeAsync(Func<TransactionScope, Task<bool>> callbackTransactionBody, bool throwException = false);
}

View File

@ -37,6 +37,9 @@
<Reference Include="AyCode.Interfaces.Server">
<HintPath>..\..\..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.Server.dll</HintPath>
</Reference>
<Reference Include="AyCode.Utils">
<HintPath>..\..\..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@ -1,4 +1,5 @@
using AyCode.Interfaces;
using AyCode.Utils.Extensions;
using Mango.Nop.Core.Dtos;
using Nop.Core.Domain.Customers;
@ -6,7 +7,7 @@ namespace Mango.Nop.Core.Models;
public class MgLoginModelResponse : IAcModelDtoBaseEmpty
{
public CustomerDto CustomerDto { get; set; }
public CustomerDto? CustomerDto { get; set; }
public string ErrorMessage { get; set; }
public MgLoginModelResponse()
@ -18,4 +19,6 @@ public class MgLoginModelResponse : IAcModelDtoBaseEmpty
CustomerDto = customerDto;
ErrorMessage = errorMessage;
}
public bool IsSuccesLogin => CustomerDto != null && ErrorMessage.IsNullOrWhiteSpace();
}

View File

@ -1,12 +1,13 @@
using AyCode.Core.Loggers;
using System.Transactions;
using AyCode.Core.Consts;
using AyCode.Core.Helpers;
using AyCode.Core.Loggers;
using AyCode.Utils.Extensions;
using Mango.Nop.Core.Interfaces;
using Mango.Nop.Core.Loggers;
using Microsoft.AspNetCore.Http;
using Mango.Nop.Services;
using Nop.Core.Caching;
using Nop.Core.Domain.Catalog;
using Nop.Core.Events;
using Nop.Data;
using Nop.Services.Events;
namespace Mango.Nop.Core.Repositories;
@ -17,14 +18,111 @@ public class MgDbContextBase : IMgDbContextBase
private readonly CacheKey _auctionAllKey = new("Nop.auction.all-{0}", AUCTION_PATTERN_KEY);
public const string AUCTION_PATTERN_KEY = "Nop.auction.";
protected readonly IMgLockService LockService;
protected ILogger Logger;
protected INopDataProvider DataProvider;
//protected IHttpContextAccessor HttpContextAccessor;
public ILogger Logger { get; init; }
public INopDataProvider DataProvider { get; init; }
public MgDbContextBase(INopDataProvider dataProvider, IEnumerable<IAcLogWriterBase> logWriters)
//public IHttpContextAccessor HttpContextAccessor { get; init; }
public MgDbContextBase(INopDataProvider dataProvider, IMgLockService lockService, IEnumerable<IAcLogWriterBase> logWriters)
{
LockService = lockService;
Logger = new Logger<MgDbContextBase>(logWriters.ToArray());
DataProvider = dataProvider;
}
public bool Transaction(Func<TransactionScope, bool> callbackTransactionBody, bool throwException = false)
=> TransactionInner(callbackTransactionBody, throwException);
/// <summary>
/// Using LoskService, global lock!
/// </summary>
/// <param name="callbackTransactionBody"></param>
/// <param name="throwException"></param>
/// <returns></returns>
public bool TransactionSafe(Func<TransactionScope, bool> callbackTransactionBody, bool throwException = false)
{
using (LockService.SemaphoreSlim.UseWait())
{
return TransactionInner(callbackTransactionBody, throwException);
}
}
public Task<bool> TransactionAsync(Func<TransactionScope, Task<bool>> callbackTransactionBody, bool throwException = false)
=> TaskHelper.ToThreadPoolTask(() => TransactionInnerAsync(callbackTransactionBody, throwException));
/// <summary>
/// Using LoskService, global lock!
/// </summary>
/// <param name="callbackTransactionBody"></param>
/// <param name="throwException"></param>
/// <returns></returns>
public Task<bool> TransactionSafeAsync(Func<TransactionScope, Task<bool>> callbackTransactionBody, bool throwException = false)
{
return TaskHelper.ToThreadPoolTask(async () =>
{
using (await LockService.SemaphoreSlim.UseWaitAsync())
{
return await TransactionInnerAsync(callbackTransactionBody, throwException);
}
});
}
private async Task<bool> TransactionInnerAsync(Func<TransactionScope, Task<bool>> callbackTransactionBody, bool throwException = false)
{
bool result;
try
{
using (var transaction = new TransactionScope( /*TransactionScopeOption.RequiresNew, */TransactionScopeAsyncFlowOption.Enabled))
{
result = await callbackTransactionBody(transaction);
if (result) transaction.Complete();
}
if (!result) Logger.Warning($"TransactionInnerAsync({this}) transaction ROLLBACK!");
}
catch (Exception ex)
{
if (throwException) throw;
result = false;
Logger.Error($"TransactionInnerAsync({this}) transaction error! ex: {ex.Message}{AcEnv.NL}", ex);
}
return result;
}
private bool TransactionInner(Func<TransactionScope, bool> callbackTransactionBody, bool throwException = false)
{
bool result;
try
{
using var transaction = new TransactionScope( /*TransactionScopeOption.RequiresNew, */TransactionScopeAsyncFlowOption.Enabled);
result = callbackTransactionBody(transaction);
if (result) transaction.Complete();
else Logger.Warning($"TransactionInner({this}) transaction ROLLBACK!");
}
catch (Exception ex)
{
if (throwException) throw;
result = false;
Logger.Error($"TransactionInnerAsync({this}) transaction error! ex: {ex.Message}{AcEnv.NL}", ex);
}
return result;
}
public override string ToString()
{
return GetType().Name;
}
}