EDennis.AspNetCore.Base
1.3.6
See the version list below for details.
dotnet add package EDennis.AspNetCore.Base --version 1.3.6
NuGet\Install-Package EDennis.AspNetCore.Base -Version 1.3.6
<PackageReference Include="EDennis.AspNetCore.Base" Version="1.3.6" />
paket add EDennis.AspNetCore.Base --version 1.3.6
#r "nuget: EDennis.AspNetCore.Base, 1.3.6"
// Install EDennis.AspNetCore.Base as a Cake Addin #addin nuget:?package=EDennis.AspNetCore.Base&version=1.3.6 // Install EDennis.AspNetCore.Base as a Cake Tool #tool nuget:?package=EDennis.AspNetCore.Base&version=1.3.6
EDennis.AspNetCore.Base
A library that facilities creating testable multi-tier applications in ASP.NET Core
Motivation
ASP.NET Core MVC and Entity Framework Core collectively provide a great framework for development of enterprise applications. That said, developing integration-testable three-tier applications with these technologies can be a little challenging at times. It is relatively easy to create a web application on one server that communicates with web API on another server, which in turn communicates with a database via Entity Framework; however, to set up proper, repeatable integration tests -- those that completely reset the database (whether in-memory or real) after each test -- is not straightforward, especially when dealing with three-tier solutions. Furthermore, to completely reset the database after spot testing via Swagger UI requires some extra set-up work. Collectively, these challenges motivated development of a library to facilitate testable three-tier application development.
Features
The current library has a number of features that assist with application development:
- Parallel Architecture for projects that access databases and projects that only access HTTP endpoints. The repository pattern is used for the former type of project. The typed client pattern is used for the latter type of project. Both patterns provide a useful abstraction layer. Both patterns use dependency injection to give controllers access to service objects -- repos and api clients.
- Temporal Entities -- entity-framework-driven support for history tables. This support was inspired by SQL Server temporal tables; however, the EF implementation makes it possible to do time-travel queries using entity framework. Several base repository methods are provided to support such queries. In addition, the EF implementation makes it possible to record the user who deleted a record -- something that requires a little more work with SQL Server temporal tables.
- ApiLauncher -- a main class (and supporting classes) that uses configuration settings to identify, start, and stop one or more web api projects; assign available random port numbers; ensure that the same project api is started only once; and update the BaseAddress of all associated HttpClients (following the typed client pattern). Importantly, the ApiLauncher launches all APIs within the same execution context as the main project, making it possible to debug into the Apis, even during automated integration testing. This utility class is especially helpful when you have multiple APIs that each use IdentityServer.
- Database Management Interceptors (middleware) that look for special header values in HTTP requests in order to create, select, or discard a specific in-memory database. This middleware makes it possible to perform multiple operations on the same in-memory database accessed indirectly through multiple layers of APIs. The interceptors work with both Swagger spot-testing and automated integration testing.
- A collection of Base Repository Classes that simplify basic Entity Framework operations but still allows querying via Linq expressions
- Numerous IServiceCollection Extension Methods that simplify the setup of Dependency Injection for
- Typed HttpClients
- DbContexts
- Repository classes
- Numerous HttpClient Extension methods that simplify basic Http operations such as posting, putting, deleting, or getting any object of type T
- Several Security Utilities that perform the following functions:
- AutologinMiddleware, which allows configuration of users that can be automatically logged on during different launch configurations
- MockClientAuthorizationMiddleware, which allows configuration of OAuth clients for which access tokens are automatically generated during different launch configurations (especially helpful if you are spot-testing with Swagger)
- AddDefaultAuthorizationPolicyConvention, which automatically adds Authorize policies to controllers and action methods (obviating the need for the Authorize attribute)
- AddClientAuthenticationAndAuthorizationWithDefaultPolicies, which is an IServiceCollection extension method that uses reflection to automatically assign default, scope-defined policies to controllers and action methods.
- Several Xunit base classes that simplify setup of unit and integration tests of projects that use in-memory databases and ApiLauncher during development.
Associated Projects
- This project has classes that replace all of the functionality provided by EDennis.EFBase
- This project is designed to work with EDennis.MigrationsExtensions, which provides assistance in performing Entity Framework migrations. In particular, the library provides a MigrationBuilder extension method called SaveMappings, which saves Table/Class and Column/Property mappings to SQL Server extended properties.
- This project is designed to work with EDennis.NetCoreTestingUtilities, which provides many helpful classes for performing unit/integration tests.
- The EDennis.DataScaffolder project provides a WinForms application that generates static data for the "HasData" method. When the EDennis.MigrationsExtensions SaveMappings extension method is used (see above), the static data have correct class names and property names.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.2 is compatible. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
-
.NETCoreApp 2.2
- Dapper (>= 1.50.7)
- EDennis.MigrationsExtensions (>= 3.1.0)
- EDennis.NetCoreTestingUtilities (>= 3.2.2)
- Flurl (>= 2.8.1)
- IdentityModel (>= 4.0.0-bruichladdich)
- IdentityServer4.EntityFramework (>= 2.3.2)
- IdentityServer4.Storage (>= 2.3.1)
- Microsoft.AspNetCore.Authorization.Policy (>= 2.2.0)
- Microsoft.AspNetCore.Mvc.Testing (>= 2.2.0)
- Microsoft.Extensions.Hosting (>= 2.2.0)
- Microsoft.SqlServer.SqlManagementObjects (>= 140.17283.0)
- NETCore.Encrypt (>= 2.0.7)
- Serilog.AspNetCore (>= 2.1.1)
- Serilog.Sinks.Console (>= 3.1.1)
- System.Linq.Dynamic.Core (>= 1.0.10)
- xunit.core (>= 2.4.1)
- xunit.extensibility.core (>= 2.4.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
3.1.2-alpha | 447 | 3/12/2020 |
3.1.1-alpha | 445 | 2/24/2020 |
3.1.0-alpha | 427 | 2/24/2020 |
2.8.0 | 783 | 10/17/2019 |
2.7.9 | 679 | 10/16/2019 |
2.7.8 | 652 | 10/15/2019 |
2.7.7 | 632 | 10/15/2019 |
2.7.6 | 631 | 10/14/2019 |
2.7.5 | 709 | 9/25/2019 |
2.7.4 | 655 | 9/19/2019 |
2.7.3 | 635 | 9/13/2019 |
2.7.1 | 677 | 9/12/2019 |
2.7.0 | 718 | 9/12/2019 |
2.6.2 | 628 | 9/3/2019 |
2.6.1 | 656 | 9/3/2019 |
2.6.0 | 666 | 8/30/2019 |
2.5.2 | 674 | 7/23/2019 |
2.5.1 | 655 | 7/15/2019 |
2.5.0 | 717 | 7/10/2019 |
2.4.8 | 677 | 6/19/2019 |
2.4.7 | 656 | 6/18/2019 |
2.4.6 | 672 | 6/18/2019 |
2.4.5 | 655 | 6/13/2019 |
2.4.4 | 690 | 6/5/2019 |
2.4.2 | 705 | 5/21/2019 |
2.3.0 | 684 | 5/8/2019 |
2.2.9 | 700 | 5/8/2019 |
2.2.8 | 644 | 5/7/2019 |
2.2.7 | 696 | 5/3/2019 |
2.2.6 | 706 | 5/3/2019 |
2.2.5 | 778 | 5/2/2019 |
2.2.4 | 778 | 5/2/2019 |
2.2.3 | 728 | 4/29/2019 |
2.2.2 | 715 | 4/24/2019 |
2.2.1 | 758 | 4/23/2019 |
2.2.0 | 780 | 4/22/2019 |
2.1.3 | 746 | 4/14/2019 |
2.1.2 | 703 | 4/6/2019 |
2.1.1 | 1,285 | 4/5/2019 |
2.1.0 | 1,271 | 4/3/2019 |
2.0.0 | 1,469 | 4/2/2019 |
1.4.5 | 1,254 | 3/29/2019 |
1.4.4 | 1,455 | 3/28/2019 |
1.4.3 | 1,486 | 3/28/2019 |
1.4.2 | 1,346 | 3/27/2019 |
1.4.1 | 1,488 | 3/26/2019 |
1.4.0 | 1,450 | 3/23/2019 |
1.3.7 | 1,282 | 3/19/2019 |
1.3.6 | 1,491 | 3/18/2019 |
1.3.5 | 1,473 | 3/12/2019 |
1.3.4 | 1,444 | 3/9/2019 |
1.3.3 | 1,398 | 3/8/2019 |
1.3.1 | 944 | 1/18/2019 |
1.3.0 | 912 | 1/18/2019 |
1.2.0 | 899 | 1/16/2019 |
1.1.0 | 808 | 12/28/2018 |
1.0.0 | 879 | 12/26/2018 |
Miscellaneous cleanup of unused classes, methods, and properties.