RESTworld.AspNetCore 1.0.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package RESTworld.AspNetCore --version 1.0.0                
NuGet\Install-Package RESTworld.AspNetCore -Version 1.0.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="RESTworld.AspNetCore" Version="1.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add RESTworld.AspNetCore --version 1.0.0                
#r "nuget: RESTworld.AspNetCore, 1.0.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install RESTworld.AspNetCore as a Cake Addin
#addin nuget:?package=RESTworld.AspNetCore&version=1.0.0

// Install RESTworld.AspNetCore as a Cake Tool
#tool nuget:?package=RESTworld.AspNetCore&version=1.0.0                

RESTworld

RESTworld is a framework which utilizes other common frameworks and patterns alltogether to enable easy and fast creation of a truly RESTful API.

Used frameworks and patterns

  • Entity Framework Core for data access
  • ASP.Net Core for hosting
  • HAL for providing hyperlinks between resources
  • OData for query support on list endpoints
  • AutoMapper for mapping between Entities and DTOs

Pipeline

The most basic pipeline has the following data flow for a request on a list endpoint:

  1. Request
  2. Controller selection through ASP.Net Core
  3. Query parsing through OData
  4. Controller method calls business service method
  5. Service gets the data through Entity Framework Core
  6. Entity Framework Core translates the query into SQL and gets the data from the database
  7. Business service translates Entities into DTOs through Automapper
  8. Controller wraps the result in a HAL response
  9. Result

Usage

Solution structure

If your API gets the name MyApi, structure your Solution with the following Projects:

  • MyApi (ASP.Net Core Web API)
    • References RESTworld.AspNetCore, MyApi.Business
    • Contains your startup logic and your custom controllers
  • MyApi.Business
    • References RESTworld.Business, MyApi.Data
    • Contains your AutoMapperConfiguration and your custom services
  • MyApi.Data
    • References RESTworld.EntityFrameworkCore, MyApi.Common
    • Contains your Entity Framework Core Database Model including Entities and Migrations
  • MyApi.Common
    • References RESTworld.Common
    • Contains your DTOs and Enums

Startup configuration

Add the following to your appsettings.json

"RESTworld": {
  "MaxNumberForListEndpoint": <whatever is an appropriate number of resources for one page>
}

Change your Program.cs to the following

namespace MyApi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            RESTworld.AspNetCore.Program<Startup>.Main(args);
        }
    }
}

Change or add your Startup class

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using RESTworld.Business.Abstractions;
using MyApi.Common.Dtos;
using MyApi.Data;
using MyApi.Data.Models;
using MyApi.Business;

namespace MyApi
{
    public class Startup : RESTworld.AspNetCore.StartupBase
    {
        public Startup(IConfiguration configuration)
            : base(configuration)
        {
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public override void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            base.Configure(app, env);

            // Optionally migrate your database to the latest version during startup
            MigrateDatabase<TDbContext>(app);
        }

        // This method gets called by the runtime. Use this method to add services to the container.
        public override void ConfigureServices(IServiceCollection services)
        {
            // Database
            services.AddDbContextFactoryWithDefaults<MyDatabase>(Configuration);
            services.AddODataModelForDbContext<MyDatabase>();
            
            // Default pipeline
            services.AddRestPipeline<TContext, TEntity, TCreateDto, TGetListDto, TGetFullDto, TUpdateDto>();

            // With custom service
            services.AddRestPipelineWithCustomService<TContext, TEntity, TCreateDto, TGetListDto, TGetFullDto, TUpdateDto, TService>();

            // With custom controller
            services.AddRestPipelineWithCustomController<TContext, TEntity, TCreateDto, TGetListDto, TGetFullDto, TUpdateDto, TController>();

            base.ConfigureServices(services);
        }

        protected override void ConfigureAutomapper(IMapperConfigurationExpression config)
            => new AutoMapperConfiguration().ConfigureAutomapper(config);
    }
}

Add an AutoMapperConfiguration to your MyApi.Business project

using AutoMapper;
using MyApi.Common.Dtos;
using MyApi.Common.Enums;
using MyApi.Data.Models;

namespace MyApi.Business
{
    public class AutoMapperConfiguration
    {
        public void ConfigureAutomapper(IMapperConfigurationExpression config)
        {
            config.CreateMap<TEntity, TDto>();

            // Add more mappings
        }
    }
}

That's it. Now you can start your API and use a HAL browser like https://chatty42.herokuapp.com/hal-explorer/index.html#uri=https://localhost:5001 to browse your API. If you are using a launchSettings.json, I suggest to use this as your "launchUrl".

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on RESTworld.AspNetCore:

Package Downloads
RESTworld.Client.AspNetCore

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
27.0.0 66 11/20/2024
26.3.3 193 11/7/2024
26.3.2 62 11/6/2024
26.3.1 83 10/30/2024
26.3.0 66 10/30/2024
26.2.0 347 10/11/2024
26.1.2 146 10/1/2024
26.1.1 73 10/1/2024
26.1.0 86 9/27/2024
26.0.0 83 9/20/2024
25.2.0 291 7/30/2024
25.1.2 107 7/18/2024
25.1.1 69 7/12/2024
25.1.0 229 7/10/2024
25.0.0 81 7/3/2024
24.1.0 116 6/10/2024
24.0.0 102 6/4/2024
23.0.0 70 6/4/2024
22.2.0 670 1/9/2024
22.0.0 153 12/22/2023
21.1.0 342 11/27/2023
21.0.1 132 11/27/2023
21.0.0 189 11/15/2023
20.1.0 315 10/23/2023
20.0.0 313 9/27/2023
19.2.2 206 9/11/2023
19.2.1 418 7/17/2023
19.2.0 250 7/3/2023
19.1.0 167 6/29/2023
19.0.0 195 6/28/2023
18.1.0 440 6/14/2023
18.0.2 381 5/25/2023
18.0.1 238 5/16/2023
18.0.0 278 5/10/2023
17.1.1 218 5/2/2023
17.1.0 230 4/30/2023
17.0.0 241 4/19/2023
16.0.0 282 3/12/2023
15.1.1 587 2/22/2023
15.1.0 308 2/9/2023
15.0.0 463 1/24/2023
14.1.0 361 1/24/2023
14.0.2 498 1/5/2023
14.0.1 312 1/5/2023
14.0.0 416 12/21/2022
13.0.0 541 11/9/2022
12.1.0 641 10/20/2022
12.0.0 530 10/20/2022
11.10.0 646 9/27/2022
11.9.0 829 6/28/2022
11.8.0 687 6/27/2022
11.7.0 640 6/23/2022
11.6.1 669 6/8/2022
11.6.0 640 6/7/2022
11.5.1 730 5/13/2022
11.5.0 986 4/1/2022
11.4.0 712 3/30/2022
11.3.1 835 3/16/2022
11.3.0 766 3/15/2022
11.2.4 781 3/13/2022
11.2.3 738 3/10/2022
11.2.2 754 3/9/2022
11.2.1 745 3/8/2022
11.1.3 918 3/7/2022
11.1.2 780 2/24/2022
11.1.1 750 2/22/2022
11.1.0 737 2/22/2022
11.0.0 760 2/21/2022
10.0.0 638 1/14/2022
9.0.4 404 1/6/2022
9.0.3 450 12/16/2021
9.0.2 429 12/9/2021
9.0.1 467 12/9/2021
9.0.0 334 12/3/2021
8.2.0 3,016 11/25/2021
8.1.1 578 11/4/2021
8.1.0 594 11/4/2021
8.0.0 646 10/28/2021
7.0.1 429 10/12/2021
7.0.0 452 10/6/2021
6.0.1 482 10/6/2021
6.0.0 436 10/6/2021
5.2.0 476 9/29/2021
5.1.0 425 9/27/2021
5.0.2 429 9/13/2021
5.0.1 409 9/8/2021
5.0.0 457 9/7/2021
4.1.0 398 8/18/2021
4.0.0 434 7/7/2021
3.0.0 451 7/5/2021
2.0.0 465 6/29/2021
1.2.0 427 5/11/2021
1.1.0 451 4/22/2021
1.0.3 419 4/1/2021
1.0.2 431 4/1/2021
1.0.1 389 4/1/2021
1.0.0 378 3/31/2021