diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index cda2de9..d4a0284 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -1,3 +1,4 @@ +# https://github.com/github/codeql-action name: "CodeQL" on: @@ -31,6 +32,11 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: "9.0.x" + - name: Initialize CodeQL uses: github/codeql-action/init@v3 with: diff --git a/.github/workflows/devskim-analysis.yml b/.github/workflows/devskim-analysis.yml index c0bc870..302cfd4 100644 --- a/.github/workflows/devskim-analysis.yml +++ b/.github/workflows/devskim-analysis.yml @@ -1,3 +1,4 @@ +# https://github.com/microsoft/DevSkim-Action name: DevSkim on: diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 2e90da4..681c8a7 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -1,3 +1,4 @@ +# https://github.com/actions/setup-dotnet name: Build on: @@ -13,7 +14,6 @@ on: - "**/*.yml" env: - DOTNET_VERSION: "8.0.x" DOTNET_NOLOGO: true DOTNET_CLI_TELEMETRY_OPTOUT: true DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true @@ -32,7 +32,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: ${{ env.DOTNET_VERSION }} + dotnet-version: "9.0.x" - name: Restore dependencies run: dotnet restore Shop.sln diff --git a/.github/workflows/sonar-cloud.yml b/.github/workflows/sonar-cloud.yml index a5f8d4d..9018d54 100644 --- a/.github/workflows/sonar-cloud.yml +++ b/.github/workflows/sonar-cloud.yml @@ -1,3 +1,4 @@ +# https://github.com/SonarSource/sonarcloud-github-action name: SonarCloud on: diff --git a/Directory.Packages.props b/Directory.Packages.props index 62f0cae..d5233fa 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -18,55 +18,56 @@ - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - + + - - - + + + + - + diff --git a/README.md b/README.md index 5cb9c03..39d3bb4 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,8 @@ If you liked this project, learned something, give it a star. Thank you! ## **Technologies** -- ASP.NET Core 8 -- Entity Framework Core 8 +- ASP.NET Core 9 +- Entity Framework Core 9 - Unit & Integration Tests + xUnit + FluentAssertions - Polly - AutoMapper @@ -73,7 +73,7 @@ docker-compose up --build --abort-on-container-exit --remove-orphans Now just open the url in the browser: ```csharp -http://localhost:5072/swagger/ +http://localhost:{port}/swagger/ ``` @@ -83,7 +83,7 @@ http://localhost:5072/swagger/ To access the page with the performance indicators and performance: ```csharp -http://localhost:5072/profiler/results-index +http://localhost:{port}/profiler/results-index ``` ## License diff --git a/global.json b/global.json index 8baf7f1..733b653 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.400", + "version": "9.0.100", "rollForward": "latestMajor", "allowPrerelease": false } diff --git a/src/Shop.Application/Shop.Application.csproj b/src/Shop.Application/Shop.Application.csproj index df7aca3..8dddd7e 100644 --- a/src/Shop.Application/Shop.Application.csproj +++ b/src/Shop.Application/Shop.Application.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 diff --git a/src/Shop.Core/Shop.Core.csproj b/src/Shop.Core/Shop.Core.csproj index 412b083..3b97659 100644 --- a/src/Shop.Core/Shop.Core.csproj +++ b/src/Shop.Core/Shop.Core.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 diff --git a/src/Shop.Domain/Shop.Domain.csproj b/src/Shop.Domain/Shop.Domain.csproj index 08fb880..cf89560 100644 --- a/src/Shop.Domain/Shop.Domain.csproj +++ b/src/Shop.Domain/Shop.Domain.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 diff --git a/src/Shop.Infrastructure/Shop.Infrastructure.csproj b/src/Shop.Infrastructure/Shop.Infrastructure.csproj index 3a69b88..b7c1b10 100644 --- a/src/Shop.Infrastructure/Shop.Infrastructure.csproj +++ b/src/Shop.Infrastructure/Shop.Infrastructure.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 diff --git a/src/Shop.PublicApi/Dockerfile b/src/Shop.PublicApi/Dockerfile index 7148a2a..3c176da 100644 --- a/src/Shop.PublicApi/Dockerfile +++ b/src/Shop.PublicApi/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/aspnet:8.0-bookworm-slim AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0-bookworm-slim AS base WORKDIR /app EXPOSE 80 @@ -10,7 +10,7 @@ ENV DOTNET_NOLOGO=1 # Specifies whether data about the .NET tools usage is collected and sent to Microsoft. ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 -FROM mcr.microsoft.com/dotnet/sdk:8.0-bookworm-slim AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0-bookworm-slim AS build WORKDIR /src COPY ["Directory.Packages.props", "."] COPY ["Directory.Build.props", "."] diff --git a/src/Shop.PublicApi/Extensions/ServicesCollectionExtensions.cs b/src/Shop.PublicApi/Extensions/ServicesCollectionExtensions.cs index d7baa2c..c9090f5 100644 --- a/src/Shop.PublicApi/Extensions/ServicesCollectionExtensions.cs +++ b/src/Shop.PublicApi/Extensions/ServicesCollectionExtensions.cs @@ -2,6 +2,7 @@ using System; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Reflection; +using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.Configuration; @@ -67,13 +68,16 @@ internal static class ServicesCollectionExtensions healthCheckBuilder.AddRedis(options.CacheConnection); } - public static IServiceCollection AddWriteDbContext(this IServiceCollection services) + public static IServiceCollection AddWriteDbContext(this IServiceCollection services, IWebHostEnvironment environment) { - services.AddDbContext((serviceProvider, optionsBuilder) => - ConfigureDbContext(serviceProvider, optionsBuilder, QueryTrackingBehavior.TrackAll)); + if (!environment.IsEnvironment("Testing")) + { + services.AddDbContext((serviceProvider, optionsBuilder) => + ConfigureDbContext(serviceProvider, optionsBuilder, QueryTrackingBehavior.TrackAll)); - services.AddDbContext((serviceProvider, optionsBuilder) => - ConfigureDbContext(serviceProvider, optionsBuilder, QueryTrackingBehavior.NoTrackingWithIdentityResolution)); + services.AddDbContext((serviceProvider, optionsBuilder) => + ConfigureDbContext(serviceProvider, optionsBuilder, QueryTrackingBehavior.NoTrackingWithIdentityResolution)); + } return services; } diff --git a/src/Shop.PublicApi/Migrations/20241128202054_EF_Update.Designer.cs b/src/Shop.PublicApi/Migrations/20241128202054_EF_Update.Designer.cs new file mode 100644 index 0000000..0f0888a --- /dev/null +++ b/src/Shop.PublicApi/Migrations/20241128202054_EF_Update.Designer.cs @@ -0,0 +1,90 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Shop.Infrastructure.Data.Context; + +#nullable disable + +namespace Shop.PublicApi.Migrations +{ + [DbContext(typeof(WriteDbContext))] + [Migration("20241128202054_EF_Update")] + partial class EF_Update + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Latin1_General_CI_AI") + .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Shop.Domain.Entities.CustomerAggregate.Customer", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("DateOfBirth") + .HasColumnType("DATE"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(100) + .IsUnicode(false) + .HasColumnType("varchar(100)"); + + b.Property("Gender") + .IsRequired() + .HasMaxLength(6) + .HasColumnType("nvarchar(6)"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(100) + .IsUnicode(false) + .HasColumnType("varchar(100)"); + + b.HasKey("Id"); + + b.ToTable("Customers"); + }); + + modelBuilder.Entity("Shop.Domain.Entities.CustomerAggregate.Customer", b => + { + b.OwnsOne("Shop.Domain.ValueObjects.Email", "Email", b1 => + { + b1.Property("CustomerId") + .HasColumnType("uniqueidentifier"); + + b1.Property("Address") + .IsRequired() + .HasMaxLength(254) + .IsUnicode(false) + .HasColumnType("varchar(254)") + .HasColumnName("Email"); + + b1.HasKey("CustomerId"); + + b1.HasIndex("Address") + .IsUnique() + .HasFilter("[Email] IS NOT NULL"); + + b1.ToTable("Customers"); + + b1.WithOwner() + .HasForeignKey("CustomerId"); + }); + + b.Navigation("Email"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Shop.PublicApi/Migrations/20241128202054_EF_Update.cs b/src/Shop.PublicApi/Migrations/20241128202054_EF_Update.cs new file mode 100644 index 0000000..3b2de85 --- /dev/null +++ b/src/Shop.PublicApi/Migrations/20241128202054_EF_Update.cs @@ -0,0 +1,39 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Shop.PublicApi.Migrations; + +/// +public partial class EF_Update : Migration +{ + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "Gender", + table: "Customers", + type: "nvarchar(6)", + maxLength: 6, + nullable: false, + oldClrType: typeof(string), + oldType: "varchar(6)", + oldUnicode: false, + oldMaxLength: 6); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "Gender", + table: "Customers", + type: "varchar(6)", + unicode: false, + maxLength: 6, + nullable: false, + oldClrType: typeof(string), + oldType: "nvarchar(6)", + oldMaxLength: 6); + } +} \ No newline at end of file diff --git a/src/Shop.PublicApi/Migrations/EventStoreDb/20241128202230_EF_Update.Designer.cs b/src/Shop.PublicApi/Migrations/EventStoreDb/20241128202230_EF_Update.Designer.cs new file mode 100644 index 0000000..f4cf229 --- /dev/null +++ b/src/Shop.PublicApi/Migrations/EventStoreDb/20241128202230_EF_Update.Designer.cs @@ -0,0 +1,61 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Shop.Infrastructure.Data.Context; + +#nullable disable + +namespace Shop.PublicApi.Migrations.EventStoreDb +{ + [DbContext(typeof(EventStoreDbContext))] + [Migration("20241128202230_EF_Update")] + partial class EF_Update + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Latin1_General_CI_AI") + .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Shop.Core.SharedKernel.EventStore", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AggregateId") + .HasColumnType("uniqueidentifier"); + + b.Property("Data") + .IsRequired() + .HasMaxLength(255) + .IsUnicode(false) + .HasColumnType("varchar(255)") + .HasComment("JSON serialized event"); + + b.Property("MessageType") + .IsRequired() + .HasMaxLength(100) + .IsUnicode(false) + .HasColumnType("varchar(100)"); + + b.Property("OccurredOn") + .HasColumnType("datetime2") + .HasColumnName("CreatedAt"); + + b.HasKey("Id"); + + b.ToTable("EventStores"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Shop.PublicApi/Migrations/EventStoreDb/20241128202230_EF_Update.cs b/src/Shop.PublicApi/Migrations/EventStoreDb/20241128202230_EF_Update.cs new file mode 100644 index 0000000..ee5edb8 --- /dev/null +++ b/src/Shop.PublicApi/Migrations/EventStoreDb/20241128202230_EF_Update.cs @@ -0,0 +1,43 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Shop.PublicApi.Migrations.EventStoreDb; + +/// +public partial class EF_Update : Migration +{ + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "Data", + table: "EventStores", + type: "varchar(255)", + unicode: false, + maxLength: 255, + nullable: false, + oldClrType: typeof(string), + oldType: "VARCHAR(MAX)", + oldUnicode: false, + comment: "JSON serialized event", + oldComment: "JSON serialized event"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "Data", + table: "EventStores", + type: "VARCHAR(MAX)", + unicode: false, + nullable: false, + oldClrType: typeof(string), + oldType: "varchar(255)", + oldUnicode: false, + oldMaxLength: 255, + comment: "JSON serialized event", + oldComment: "JSON serialized event"); + } +} \ No newline at end of file diff --git a/src/Shop.PublicApi/Migrations/EventStoreDb/EventStoreDbContextModelSnapshot.cs b/src/Shop.PublicApi/Migrations/EventStoreDb/EventStoreDbContextModelSnapshot.cs index cc813c6..6f6d371 100644 --- a/src/Shop.PublicApi/Migrations/EventStoreDb/EventStoreDbContextModelSnapshot.cs +++ b/src/Shop.PublicApi/Migrations/EventStoreDb/EventStoreDbContextModelSnapshot.cs @@ -2,6 +2,8 @@ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Shop.Infrastructure.Data.Context; #nullable disable @@ -16,12 +18,12 @@ namespace Shop.PublicApi.Migrations.EventStoreDb #pragma warning disable 612, 618 modelBuilder .UseCollation("Latin1_General_CI_AI") - .HasAnnotation("ProductVersion", "7.0.3") + .HasAnnotation("ProductVersion", "9.0.0") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - modelBuilder.Entity("Shop.Core.Events.EventStore", b => + modelBuilder.Entity("Shop.Core.SharedKernel.EventStore", b => { b.Property("Id") .HasColumnType("uniqueidentifier"); @@ -31,8 +33,9 @@ namespace Shop.PublicApi.Migrations.EventStoreDb b.Property("Data") .IsRequired() + .HasMaxLength(255) .IsUnicode(false) - .HasColumnType("VARCHAR(MAX)") + .HasColumnType("varchar(255)") .HasComment("JSON serialized event"); b.Property("MessageType") diff --git a/src/Shop.PublicApi/Migrations/WriteDbContextModelSnapshot.cs b/src/Shop.PublicApi/Migrations/WriteDbContextModelSnapshot.cs index 3c638fd..74fb547 100644 --- a/src/Shop.PublicApi/Migrations/WriteDbContextModelSnapshot.cs +++ b/src/Shop.PublicApi/Migrations/WriteDbContextModelSnapshot.cs @@ -2,6 +2,8 @@ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Shop.Infrastructure.Data.Context; #nullable disable @@ -16,12 +18,12 @@ namespace Shop.PublicApi.Migrations #pragma warning disable 612, 618 modelBuilder .UseCollation("Latin1_General_CI_AI") - .HasAnnotation("ProductVersion", "7.0.2") + .HasAnnotation("ProductVersion", "9.0.0") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - modelBuilder.Entity("Shop.Domain.Entities.Customer.Customer", b => + modelBuilder.Entity("Shop.Domain.Entities.CustomerAggregate.Customer", b => { b.Property("Id") .HasColumnType("uniqueidentifier"); @@ -38,8 +40,7 @@ namespace Shop.PublicApi.Migrations b.Property("Gender") .IsRequired() .HasMaxLength(6) - .IsUnicode(false) - .HasColumnType("varchar(6)"); + .HasColumnType("nvarchar(6)"); b.Property("LastName") .IsRequired() @@ -52,7 +53,7 @@ namespace Shop.PublicApi.Migrations b.ToTable("Customers"); }); - modelBuilder.Entity("Shop.Domain.Entities.Customer.Customer", b => + modelBuilder.Entity("Shop.Domain.Entities.CustomerAggregate.Customer", b => { b.OwnsOne("Shop.Domain.ValueObjects.Email", "Email", b1 => { diff --git a/src/Shop.PublicApi/Program.cs b/src/Shop.PublicApi/Program.cs index 62d8dbf..3752426 100644 --- a/src/Shop.PublicApi/Program.cs +++ b/src/Shop.PublicApi/Program.cs @@ -65,7 +65,7 @@ builder.Services .AddInfrastructure() .AddCommandHandlers() .AddQueryHandlers() - .AddWriteDbContext() + .AddWriteDbContext(builder.Environment) .AddWriteOnlyRepositories() .AddReadDbContext() .AddReadOnlyRepositories() diff --git a/src/Shop.PublicApi/Shop.PublicApi.csproj b/src/Shop.PublicApi/Shop.PublicApi.csproj index 83b4a13..e295b61 100644 --- a/src/Shop.PublicApi/Shop.PublicApi.csproj +++ b/src/Shop.PublicApi/Shop.PublicApi.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 true true 7d8d0af0-7540-48a6-b160-d34c988a1ad6 @@ -61,6 +61,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + @@ -76,7 +77,7 @@ - + \ No newline at end of file diff --git a/src/Shop.Query/Shop.Query.csproj b/src/Shop.Query/Shop.Query.csproj index 36952c7..f61c21a 100644 --- a/src/Shop.Query/Shop.Query.csproj +++ b/src/Shop.Query/Shop.Query.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 diff --git a/tests/Shop.IntegrationTests/Controllers/V1/CustomersControllerTests.cs b/tests/Shop.IntegrationTests/Controllers/V1/CustomersControllerTests.cs index b7d4476..2f5db7f 100644 --- a/tests/Shop.IntegrationTests/Controllers/V1/CustomersControllerTests.cs +++ b/tests/Shop.IntegrationTests/Controllers/V1/CustomersControllerTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data.Common; using System.Net; using System.Threading.Tasks; using Bogus; @@ -9,6 +10,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; @@ -477,12 +479,14 @@ public class CustomersControllerTests : IAsyncLifetime hostBuilder.UseSetting("CacheOptions:AbsoluteExpirationInHours", "1"); hostBuilder.UseSetting("CacheOptions:SlidingExpirationInSeconds", "30"); - hostBuilder.UseEnvironment(Environments.Production); + hostBuilder.UseEnvironment("Testing"); hostBuilder.ConfigureLogging(logging => logging.ClearProviders()); hostBuilder.ConfigureServices(services => { + services.RemoveAll(); + services.RemoveAll(); services.RemoveAll(); services.RemoveAll>(); services.RemoveAll(); @@ -491,10 +495,14 @@ public class CustomersControllerTests : IAsyncLifetime services.RemoveAll(); services.AddDbContext( - options => options.UseSqlite(_writeDbContextSqlite)); + options => options + .UseSqlite(_writeDbContextSqlite) + .ConfigureWarnings(warningBuilder => warningBuilder.Ignore(InMemoryEventId.TransactionIgnoredWarning))); services.AddDbContext( - options => options.UseSqlite(_eventStoreDbContextSqlite)); + options => options + .UseSqlite(_eventStoreDbContextSqlite) + .ConfigureWarnings(warningBuilder => warningBuilder.Ignore(InMemoryEventId.TransactionIgnoredWarning))); services.AddSingleton(_ => Substitute.For()); services.AddSingleton(_ => Substitute.For()); diff --git a/tests/Shop.IntegrationTests/Extensions/TRequestExtensions.cs b/tests/Shop.IntegrationTests/Extensions/TRequestExtensions.cs index ecc5ed6..32462f6 100644 --- a/tests/Shop.IntegrationTests/Extensions/TRequestExtensions.cs +++ b/tests/Shop.IntegrationTests/Extensions/TRequestExtensions.cs @@ -9,4 +9,4 @@ public static class TRequestExtensions { public static HttpContent ToJsonHttpContent(this TRequest request) => new StringContent(request.ToJson(), Encoding.UTF8, MediaTypeNames.Application.Json); -} +} \ No newline at end of file diff --git a/tests/Shop.IntegrationTests/Shop.IntegrationTests.csproj b/tests/Shop.IntegrationTests/Shop.IntegrationTests.csproj index d12e00f..0a02efb 100644 --- a/tests/Shop.IntegrationTests/Shop.IntegrationTests.csproj +++ b/tests/Shop.IntegrationTests/Shop.IntegrationTests.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 false true True @@ -60,6 +60,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/tests/Shop.UnitTests/Shop.UnitTests.csproj b/tests/Shop.UnitTests/Shop.UnitTests.csproj index be61bcb..a7bf9bb 100644 --- a/tests/Shop.UnitTests/Shop.UnitTests.csproj +++ b/tests/Shop.UnitTests/Shop.UnitTests.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 false true True @@ -57,6 +57,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive +