diff --git a/.github/delete.jpg b/.github/delete.jpg
index ecf1345..0291a8f 100644
Binary files a/.github/delete.jpg and b/.github/delete.jpg differ
diff --git a/.github/get.jpg b/.github/get.jpg
index 07b0e1a..31de135 100644
Binary files a/.github/get.jpg and b/.github/get.jpg differ
diff --git a/.github/getSingle.jpg b/.github/getSingle.jpg
index 4178a0a..d64b119 100644
Binary files a/.github/getSingle.jpg and b/.github/getSingle.jpg differ
diff --git a/.github/patch.jpg b/.github/patch.jpg
index 39a8dee..d418fd2 100644
Binary files a/.github/patch.jpg and b/.github/patch.jpg differ
diff --git a/.github/post.jpg b/.github/post.jpg
index ac87181..53acd87 100644
Binary files a/.github/post.jpg and b/.github/post.jpg differ
diff --git a/.github/put.jpg b/.github/put.jpg
index 3769ca4..6ce793c 100644
Binary files a/.github/put.jpg and b/.github/put.jpg differ
diff --git a/.github/versions.jpg b/.github/versions.jpg
index 3868e37..289a4b5 100644
Binary files a/.github/versions.jpg and b/.github/versions.jpg differ
diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml
index f9dfed3..4379c5c 100644
--- a/.github/workflows/dotnetcore.yml
+++ b/.github/workflows/dotnetcore.yml
@@ -8,10 +8,10 @@ jobs:
     runs-on: ubuntu-latest
 
     steps:
-    - uses: actions/checkout@v1
+    - uses: actions/checkout@v3
     - name: Setup .NET Core
-      uses: actions/setup-dotnet@v1
+      uses: actions/setup-dotnet@v2
       with:
-        dotnet-version: '5.0.100'
+        dotnet-version: '7.0.x'
     - name: Build with dotnet
       run: dotnet build --configuration Release
diff --git a/SampleWebApiAspNetCore.sln b/SampleWebApiAspNetCore.sln
index 46efc91..6eee05a 100644
--- a/SampleWebApiAspNetCore.sln
+++ b/SampleWebApiAspNetCore.sln
@@ -1,9 +1,9 @@
 ﻿
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29318.209
+# Visual Studio Version 17
+VisualStudioVersion = 17.2.32616.157
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleWebApiAspNetCore", "SampleWebApiAspNetCore\SampleWebApiAspNetCore.csproj", "{62E0EE7C-8CF6-4E04-B3A1-49A19DE3FC75}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleWebApiAspNetCore", "SampleWebApiAspNetCore\SampleWebApiAspNetCore.csproj", "{36DF3175-0775-44CC-8708-5B67F2ED70FE}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -11,15 +11,15 @@ Global
 		Release|Any CPU = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{62E0EE7C-8CF6-4E04-B3A1-49A19DE3FC75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{62E0EE7C-8CF6-4E04-B3A1-49A19DE3FC75}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{62E0EE7C-8CF6-4E04-B3A1-49A19DE3FC75}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{62E0EE7C-8CF6-4E04-B3A1-49A19DE3FC75}.Release|Any CPU.Build.0 = Release|Any CPU
+		{36DF3175-0775-44CC-8708-5B67F2ED70FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{36DF3175-0775-44CC-8708-5B67F2ED70FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{36DF3175-0775-44CC-8708-5B67F2ED70FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{36DF3175-0775-44CC-8708-5B67F2ED70FE}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
-		SolutionGuid = {34868541-E39B-446C-935B-C0F838B5DEC3}
+		SolutionGuid = {FFE92053-3580-432E-981F-30657B3AF39A}
 	EndGlobalSection
 EndGlobal
diff --git a/SampleWebApiAspNetCore/.vscode/launch.json b/SampleWebApiAspNetCore/.vscode/launch.json
deleted file mode 100644
index 12ee3b9..0000000
--- a/SampleWebApiAspNetCore/.vscode/launch.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
-  // Use IntelliSense to learn about possible attributes.
-  // Hover to view descriptions of existing attributes.
-  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
-  "version": "0.2.0",
-  "configurations": [{
-      "name": ".NET Core Launch (console)",
-      "type": "coreclr",
-      "request": "launch",
-      "preLaunchTask": "build",
-      "program": "${workspaceFolder}/bin/Debug/netcoreapp3.1/SampleWebApiAspNetCore.dll",
-      "args": [],
-      "cwd": "${workspaceFolder}",
-      "console": "internalConsole",
-      "stopAtEntry": false,
-      "internalConsoleOptions": "openOnSessionStart"
-    },
-    {
-      "name": ".NET Core Launch (web)",
-      "type": "coreclr",
-      "request": "launch",
-      "preLaunchTask": "build",
-      "program": "${workspaceFolder}/bin/Debug/netcoreapp3.1/SampleWebApiAspNetCore.dll",
-      "args": [],
-      "cwd": "${workspaceFolder}",
-      "stopAtEntry": false,
-      "internalConsoleOptions": "openOnSessionStart",
-      "launchBrowser": {
-        "enabled": true,
-        "args": "${auto-detect-url}",
-        "windows": {
-          "command": "cmd.exe",
-          "args": "/C start ${auto-detect-url}"
-        },
-        "osx": {
-          "command": "open"
-        },
-        "linux": {
-          "command": "xdg-open"
-        }
-      },
-      "env": {
-        "ASPNETCORE_ENVIRONMENT": "Development"
-      },
-      "sourceFileMap": {
-        "/Views": "${workspaceFolder}/Views"
-      }
-    },
-    {
-      "name": ".NET Core Attach",
-      "type": "coreclr",
-      "request": "attach",
-      "processId": "${command:pickProcess}"
-    }
-  ]
-}
\ No newline at end of file
diff --git a/SampleWebApiAspNetCore/.vscode/tasks.json b/SampleWebApiAspNetCore/.vscode/tasks.json
deleted file mode 100644
index 571f02f..0000000
--- a/SampleWebApiAspNetCore/.vscode/tasks.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  // See https://go.microsoft.com/fwlink/?LinkId=733558
-  // for the documentation about the tasks.json format
-  "version": "2.0.0",
-  "tasks": [
-    {
-      "label": "build",
-      "command": "dotnet build",
-      "type": "shell",
-      "group": "build",
-      "presentation": {
-        "reveal": "silent"
-      },
-      "problemMatcher": "$msCompile"
-    }
-  ]
-}
diff --git a/SampleWebApiAspNetCore/ConfigureSwaggerOptions.cs b/SampleWebApiAspNetCore/ConfigureSwaggerOptions.cs
index f37127c..c290430 100644
--- a/SampleWebApiAspNetCore/ConfigureSwaggerOptions.cs
+++ b/SampleWebApiAspNetCore/ConfigureSwaggerOptions.cs
@@ -1,5 +1,4 @@
 ﻿using Microsoft.AspNetCore.Mvc.ApiExplorer;
-using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Options;
 using Microsoft.OpenApi.Models;
 using Swashbuckle.AspNetCore.SwaggerGen;
diff --git a/SampleWebApiAspNetCore/Controllers/v1/FoodsController.cs b/SampleWebApiAspNetCore/Controllers/v1/FoodsController.cs
index 55d2897..f6758c4 100644
--- a/SampleWebApiAspNetCore/Controllers/v1/FoodsController.cs
+++ b/SampleWebApiAspNetCore/Controllers/v1/FoodsController.cs
@@ -1,36 +1,33 @@
-﻿using System;
-using System.Linq;
-using AutoMapper;
-using SampleWebApiAspNetCore.Dtos;
-using Microsoft.AspNetCore.JsonPatch;
+﻿using Microsoft.AspNetCore.JsonPatch;
 using Microsoft.AspNetCore.Mvc;
-using SampleWebApiAspNetCore.Repositories;
-using System.Collections.Generic;
+using SampleWebApiAspNetCore.Dtos;
 using SampleWebApiAspNetCore.Entities;
-using SampleWebApiAspNetCore.Models;
 using SampleWebApiAspNetCore.Helpers;
+using SampleWebApiAspNetCore.Services;
+using SampleWebApiAspNetCore.Models;
+using SampleWebApiAspNetCore.Repositories;
 using System.Text.Json;
+using MapsterMapper;
 
-namespace SampleWebApiAspNetCore.v1.Controllers
+namespace SampleWebApiAspNetCore.Controllers.v1
 {
     [ApiController]
     [ApiVersion("1.0")]
     [Route("api/v{version:apiVersion}/[controller]")]
-    //[Route("api/[controller]")]
     public class FoodsController : ControllerBase
     {
         private readonly IFoodRepository _foodRepository;
-        private readonly IUrlHelper _urlHelper;
         private readonly IMapper _mapper;
+        private readonly ILinkService<FoodsController> _linkService;
 
         public FoodsController(
-            IUrlHelper urlHelper,
             IFoodRepository foodRepository,
-            IMapper mapper)
+            IMapper mapper,
+            ILinkService<FoodsController> linkService)
         {
             _foodRepository = foodRepository;
             _mapper = mapper;
-            _urlHelper = urlHelper;
+            _linkService = linkService;
         }
 
         [HttpGet(Name = nameof(GetAllFoods))]
@@ -50,9 +47,8 @@ public ActionResult GetAllFoods(ApiVersion version, [FromQuery] QueryParameters
 
             Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata));
 
-            var links = CreateLinksForCollection(queryParameters, allItemCount, version);
-
-            var toReturn = foodItems.Select(x => ExpandSingleFoodItem(x, version));
+            var links = _linkService.CreateLinksForCollection(queryParameters, allItemCount, version);
+            var toReturn = foodItems.Select(x => _linkService.ExpandSingleFoodItem(x, x.Id, version));
 
             return Ok(new
             {
@@ -72,7 +68,9 @@ public ActionResult GetSingleFood(ApiVersion version, int id)
                 return NotFound();
             }
 
-            return Ok(ExpandSingleFoodItem(foodItem, version));
+            FoodDto item = _mapper.Map<FoodDto>(foodItem);
+
+            return Ok(_linkService.ExpandSingleFoodItem(item, item.Id, version));
         }
 
         [HttpPost(Name = nameof(AddFood))]
@@ -93,14 +91,15 @@ public ActionResult<FoodDto> AddFood(ApiVersion version, [FromBody] FoodCreateDt
             }
 
             FoodEntity newFoodItem = _foodRepository.GetSingle(toAdd.Id);
+            FoodDto foodDto = _mapper.Map<FoodDto>(newFoodItem);
 
             return CreatedAtRoute(nameof(GetSingleFood),
                 new { version = version.ToString(), id = newFoodItem.Id },
-                _mapper.Map<FoodDto>(newFoodItem));
+                _linkService.ExpandSingleFoodItem(foodDto, foodDto.Id, version));
         }
 
         [HttpPatch("{id:int}", Name = nameof(PartiallyUpdateFood))]
-        public ActionResult<FoodDto> PartiallyUpdateFood(int id, [FromBody] JsonPatchDocument<FoodUpdateDto> patchDoc)
+        public ActionResult<FoodDto> PartiallyUpdateFood(ApiVersion version, int id, [FromBody] JsonPatchDocument<FoodUpdateDto> patchDoc)
         {
             if (patchDoc == null)
             {
@@ -132,7 +131,9 @@ public ActionResult<FoodDto> PartiallyUpdateFood(int id, [FromBody] JsonPatchDoc
                 throw new Exception("Updating a fooditem failed on save.");
             }
 
-            return Ok(_mapper.Map<FoodDto>(updated));
+            FoodDto foodDto = _mapper.Map<FoodDto>(updated);
+
+            return Ok(_linkService.ExpandSingleFoodItem(foodDto, foodDto.Id, version));
         }
 
         [HttpDelete]
@@ -158,7 +159,7 @@ public ActionResult RemoveFood(int id)
 
         [HttpPut]
         [Route("{id:int}", Name = nameof(UpdateFood))]
-        public ActionResult<FoodDto> UpdateFood(int id, [FromBody] FoodUpdateDto foodUpdateDto)
+        public ActionResult<FoodDto> UpdateFood(ApiVersion version, int id, [FromBody] FoodUpdateDto foodUpdateDto)
         {
             if (foodUpdateDto == null)
             {
@@ -181,7 +182,9 @@ public ActionResult<FoodDto> UpdateFood(int id, [FromBody] FoodUpdateDto foodUpd
                 throw new Exception("Updating a fooditem failed on save.");
             }
 
-            return Ok(_mapper.Map<FoodDto>(existingFoodItem));
+            FoodDto foodDto = _mapper.Map<FoodDto>(existingFoodItem);
+
+            return Ok(_linkService.ExpandSingleFoodItem(foodDto, foodDto.Id, version));
         }
 
         [HttpGet("GetRandomMeal", Name = nameof(GetRandomMeal))]
@@ -189,13 +192,12 @@ public ActionResult GetRandomMeal()
         {
             ICollection<FoodEntity> foodItems = _foodRepository.GetRandomMeal();
 
-            IEnumerable<FoodDto> dtos = foodItems
-                .Select(x => _mapper.Map<FoodDto>(x));
+            IEnumerable<FoodDto> dtos = foodItems.Select(x => _mapper.Map<FoodDto>(x));
 
             var links = new List<LinkDto>();
 
             // self 
-            links.Add(new LinkDto(_urlHelper.Link(nameof(GetRandomMeal), null), "self", "GET"));
+            links.Add(new LinkDto(Url.Link(nameof(GetRandomMeal), null), "self", "GET"));
 
             return Ok(new
             {
@@ -203,105 +205,5 @@ public ActionResult GetRandomMeal()
                 links = links
             });
         }
-
-        private List<LinkDto> CreateLinksForCollection(QueryParameters queryParameters, int totalCount, ApiVersion version)
-        {
-            var links = new List<LinkDto>();
-
-            // self 
-            links.Add(new LinkDto(_urlHelper.Link(nameof(GetAllFoods), new
-            {
-                pagecount = queryParameters.PageCount,
-                page = queryParameters.Page,
-                orderby = queryParameters.OrderBy
-            }), "self", "GET"));
-
-            links.Add(new LinkDto(_urlHelper.Link(nameof(GetAllFoods), new
-            {
-                pagecount = queryParameters.PageCount,
-                page = 1,
-                orderby = queryParameters.OrderBy
-            }), "first", "GET"));
-
-            links.Add(new LinkDto(_urlHelper.Link(nameof(GetAllFoods), new
-            {
-                pagecount = queryParameters.PageCount,
-                page = queryParameters.GetTotalPages(totalCount),
-                orderby = queryParameters.OrderBy
-            }), "last", "GET"));
-
-            if (queryParameters.HasNext(totalCount))
-            {
-                links.Add(new LinkDto(_urlHelper.Link(nameof(GetAllFoods), new
-                {
-                    pagecount = queryParameters.PageCount,
-                    page = queryParameters.Page + 1,
-                    orderby = queryParameters.OrderBy
-                }), "next", "GET"));
-            }
-
-            if (queryParameters.HasPrevious())
-            {
-                links.Add(new LinkDto(_urlHelper.Link(nameof(GetAllFoods), new
-                {
-                    pagecount = queryParameters.PageCount,
-                    page = queryParameters.Page - 1,
-                    orderby = queryParameters.OrderBy
-                }), "previous", "GET"));
-            }
-
-            var posturl = _urlHelper.Link(nameof(AddFood), new { version = version.ToString() });
-
-            links.Add(
-               new LinkDto(posturl,
-               "create_food",
-               "POST"));
-
-            return links;
-        }
-
-        private dynamic ExpandSingleFoodItem(FoodEntity foodItem, ApiVersion version)
-        {
-            var links = GetLinks(foodItem.Id, version);
-            FoodDto item = _mapper.Map<FoodDto>(foodItem);
-
-            var resourceToReturn = item.ToDynamic() as IDictionary<string, object>;
-            resourceToReturn.Add("links", links);
-
-            return resourceToReturn;
-        }
-
-        private IEnumerable<LinkDto> GetLinks(int id, ApiVersion version)
-        {
-            var links = new List<LinkDto>();
-
-            var getLink = _urlHelper.Link(nameof(GetSingleFood), new { version = version.ToString(), id = id });
-
-            links.Add(
-              new LinkDto(getLink, "self", "GET"));
-
-            var deleteLink = _urlHelper.Link(nameof(RemoveFood), new { version = version.ToString(), id = id });
-
-            links.Add(
-              new LinkDto(deleteLink,
-              "delete_food",
-              "DELETE"));
-
-            var createLink = _urlHelper.Link(nameof(AddFood), new { version = version.ToString() });
-
-            links.Add(
-              new LinkDto(createLink,
-              "create_food",
-              "POST"));
-
-            var updateLink = _urlHelper.Link(nameof(UpdateFood), new { version = version.ToString(), id = id });
-
-            links.Add(
-               new LinkDto(updateLink,
-               "update_food",
-               "PUT"));
-
-            return links;
-        }
     }
 }
diff --git a/SampleWebApiAspNetCore/Controllers/v2/FoodsController.cs b/SampleWebApiAspNetCore/Controllers/v2/FoodsController.cs
index 036a519..a3477c1 100644
--- a/SampleWebApiAspNetCore/Controllers/v2/FoodsController.cs
+++ b/SampleWebApiAspNetCore/Controllers/v2/FoodsController.cs
@@ -1,6 +1,6 @@
 ﻿using Microsoft.AspNetCore.Mvc;
 
-namespace SampleWebApiAspNetCore.v2.Controllers
+namespace SampleWebApiAspNetCore.Controllers.v2
 {
     [ApiController]
     [ApiVersion("2.0")]
diff --git a/SampleWebApiAspNetCore/Dtos/FoodCreateDto.cs b/SampleWebApiAspNetCore/Dtos/FoodCreateDto.cs
index 241a152..697dba7 100644
--- a/SampleWebApiAspNetCore/Dtos/FoodCreateDto.cs
+++ b/SampleWebApiAspNetCore/Dtos/FoodCreateDto.cs
@@ -1,16 +1,12 @@
-﻿using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.Linq;
-using System.Threading.Tasks;
+﻿using System.ComponentModel.DataAnnotations;
 
 namespace SampleWebApiAspNetCore.Dtos
 {
     public class FoodCreateDto
     {
         [Required]
-        public string Name { get; set; }
-        public string Type { get; set; }
+        public string? Name { get; set; }
+        public string? Type { get; set; }
         public int Calories { get; set; }
         public DateTime Created { get; set; }
     }
diff --git a/SampleWebApiAspNetCore/Dtos/FoodDto.cs b/SampleWebApiAspNetCore/Dtos/FoodDto.cs
index a005dfe..997c27e 100644
--- a/SampleWebApiAspNetCore/Dtos/FoodDto.cs
+++ b/SampleWebApiAspNetCore/Dtos/FoodDto.cs
@@ -1,12 +1,10 @@
-﻿using System;
-
-namespace SampleWebApiAspNetCore.Dtos
+﻿namespace SampleWebApiAspNetCore.Dtos
 {
     public class FoodDto
     {
         public int Id { get; set; }
-        public string Name { get; set; }
-        public string Type { get; set; }
+        public string? Name { get; set; }
+        public string? Type { get; set; }
         public int Calories { get; set; }
         public DateTime Created { get; set; }
     }
diff --git a/SampleWebApiAspNetCore/Dtos/FoodUpdateDto.cs b/SampleWebApiAspNetCore/Dtos/FoodUpdateDto.cs
index 0e3ed60..232b6bb 100644
--- a/SampleWebApiAspNetCore/Dtos/FoodUpdateDto.cs
+++ b/SampleWebApiAspNetCore/Dtos/FoodUpdateDto.cs
@@ -1,15 +1,11 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-
+﻿
 namespace SampleWebApiAspNetCore.Dtos
 {
     public class FoodUpdateDto
     {
-        public string Name { get; set; }
+        public string? Name { get; set; }
         public int Calories { get; set; }
-        public string Type { get; set; }
+        public string? Type { get; set; }
         public DateTime Created { get; set; }
     }
 }
diff --git a/SampleWebApiAspNetCore/Entities/FoodEntity.cs b/SampleWebApiAspNetCore/Entities/FoodEntity.cs
index 39e4d8c..fc03b43 100644
--- a/SampleWebApiAspNetCore/Entities/FoodEntity.cs
+++ b/SampleWebApiAspNetCore/Entities/FoodEntity.cs
@@ -1,12 +1,10 @@
-﻿using System;
-
-namespace SampleWebApiAspNetCore.Entities
+﻿namespace SampleWebApiAspNetCore.Entities
 {
     public class FoodEntity
     {
         public int Id { get; set; }
-        public string Name { get; set; }
-        public string Type { get; set; }
+        public string? Name { get; set; }
+        public string? Type { get; set; }
         public int Calories { get; set; }
         public DateTime Created { get; set; }
     }
diff --git a/SampleWebApiAspNetCore/Helpers/ExceptionExtension.cs b/SampleWebApiAspNetCore/Helpers/ExceptionExtension.cs
index a343521..d2eff76 100644
--- a/SampleWebApiAspNetCore/Helpers/ExceptionExtension.cs
+++ b/SampleWebApiAspNetCore/Helpers/ExceptionExtension.cs
@@ -1,9 +1,4 @@
-﻿using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Diagnostics;
-using Microsoft.Extensions.Logging;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.Hosting;
+﻿using Microsoft.AspNetCore.Diagnostics;
 
 namespace SampleWebApiAspNetCore.Helpers
 {
diff --git a/SampleWebApiAspNetCore/Helpers/QueryParametersExtensions.cs b/SampleWebApiAspNetCore/Helpers/QueryParametersExtensions.cs
index 210f105..fce6c9b 100644
--- a/SampleWebApiAspNetCore/Helpers/QueryParametersExtensions.cs
+++ b/SampleWebApiAspNetCore/Helpers/QueryParametersExtensions.cs
@@ -1,5 +1,3 @@
-using System;
-using System.Linq;
 using SampleWebApiAspNetCore.Models;
 
 namespace SampleWebApiAspNetCore.Helpers
diff --git a/SampleWebApiAspNetCore/Helpers/SeedDataExtension.cs b/SampleWebApiAspNetCore/Helpers/SeedDataExtension.cs
new file mode 100644
index 0000000..acbc871
--- /dev/null
+++ b/SampleWebApiAspNetCore/Helpers/SeedDataExtension.cs
@@ -0,0 +1,19 @@
+﻿using SampleWebApiAspNetCore.Repositories;
+using SampleWebApiAspNetCore.Services;
+
+namespace SampleWebApiAspNetCore.Helpers
+{
+    public static class SeedDataExtension
+    {
+        public static void SeedData(this WebApplication app)
+        {
+            using (var scope = app.Services.CreateScope())
+            {
+                var dbContext = scope.ServiceProvider.GetRequiredService<FoodDbContext>();
+                var seedDataService = scope.ServiceProvider.GetRequiredService<ISeedDataService>();
+
+                seedDataService.Initialize(dbContext);
+            }
+        }
+    }
+}
diff --git a/SampleWebApiAspNetCore/Helpers/VersioningExtension.cs b/SampleWebApiAspNetCore/Helpers/VersioningExtension.cs
index 639de5d..a3d80d1 100644
--- a/SampleWebApiAspNetCore/Helpers/VersioningExtension.cs
+++ b/SampleWebApiAspNetCore/Helpers/VersioningExtension.cs
@@ -14,7 +14,9 @@ public static void AddVersioning(this IServiceCollection services)
                    config.ReportApiVersions = true;
                    config.AssumeDefaultVersionWhenUnspecified = true;
                    config.DefaultApiVersion = new ApiVersion(1, 0);
-                   config.ApiVersionReader = new HeaderApiVersionReader("api-version");
+                   config.ApiVersionReader = ApiVersionReader.Combine(new UrlSegmentApiVersionReader(),
+                                                                                        new HeaderApiVersionReader("x-api-version"),
+                                                                                        new MediaTypeApiVersionReader("x-api-version"));
                });
             services.AddVersionedApiExplorer(
                 options =>
diff --git a/SampleWebApiAspNetCore/MappingProfiles/FoodMappings.cs b/SampleWebApiAspNetCore/MappingProfiles/FoodMappings.cs
deleted file mode 100644
index 42cdbed..0000000
--- a/SampleWebApiAspNetCore/MappingProfiles/FoodMappings.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-﻿using AutoMapper;
-using SampleWebApiAspNetCore.Dtos;
-using SampleWebApiAspNetCore.Entities;
-
-namespace SampleWebApiAspNetCore.MappingProfiles
-{
-    public class FoodMappings : Profile
-    {
-        public FoodMappings()
-        {
-            CreateMap<FoodEntity, FoodDto>().ReverseMap();
-            CreateMap<FoodEntity, FoodUpdateDto>().ReverseMap();
-            CreateMap<FoodEntity, FoodCreateDto>().ReverseMap();
-        }
-    }
-}
diff --git a/SampleWebApiAspNetCore/Models/QueryParameters.cs b/SampleWebApiAspNetCore/Models/QueryParameters.cs
index 7f291cf..4df17ba 100644
--- a/SampleWebApiAspNetCore/Models/QueryParameters.cs
+++ b/SampleWebApiAspNetCore/Models/QueryParameters.cs
@@ -1,5 +1,3 @@
-using System;
-using System.Linq;
 
 namespace SampleWebApiAspNetCore.Models
 {
@@ -14,8 +12,8 @@ public int PageCount
             get { return _pageCount; }
             set { _pageCount = (value > maxPageCount) ? maxPageCount : value; }
         }
-        
-        public string Query { get; set; }
+
+        public string? Query { get; set; } = "";
 
         public string OrderBy { get; set; } = "Name";
     }
diff --git a/SampleWebApiAspNetCore/Program.cs b/SampleWebApiAspNetCore/Program.cs
index 97d0b75..00b41bb 100644
--- a/SampleWebApiAspNetCore/Program.cs
+++ b/SampleWebApiAspNetCore/Program.cs
@@ -1,45 +1,78 @@
-﻿using Microsoft.AspNetCore;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
+using Mapster;
+using Microsoft.AspNetCore.Mvc.ApiExplorer;
+using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.AspNetCore.Mvc.Routing;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Options;
+using Newtonsoft.Json.Serialization;
+using SampleWebApiAspNetCore;
+using SampleWebApiAspNetCore.Helpers;
 using SampleWebApiAspNetCore.Repositories;
 using SampleWebApiAspNetCore.Services;
-using System;
+using Swashbuckle.AspNetCore.SwaggerGen;
 
-namespace SampleWebApiAspNetCore
+var builder = WebApplication.CreateBuilder(args);
+
+// Add services to the container.
+
+builder.Services.AddControllers()
+                .AddNewtonsoftJson(options =>
+                       options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver()); 
+
+// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
+builder.Services.AddEndpointsApiExplorer();
+builder.Services.AddSwaggerGen();
+
+builder.Services.AddCustomCors("AllowAllOrigins");
+
+builder.Services.AddSingleton<ISeedDataService, SeedDataService>();
+builder.Services.AddScoped<IFoodRepository, FoodSqlRepository>();
+builder.Services.AddScoped(typeof(ILinkService<>), typeof(LinkService<>));
+builder.Services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();
+
+builder.Services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
+builder.Services.AddSingleton<IUrlHelperFactory, UrlHelperFactory>();
+
+builder.Services.AddRouting(options => options.LowercaseUrls = true);
+builder.Services.AddVersioning();
+
+builder.Services.AddDbContext<FoodDbContext>(opt =>
+    opt.UseInMemoryDatabase("FoodDatabase"));
+
+builder.Services.AddMapster();
+
+var app = builder.Build();
+
+var apiVersionDescriptionProvider = app.Services.GetRequiredService<IApiVersionDescriptionProvider>();
+var loggerFactory = app.Services.GetRequiredService<ILoggerFactory>();
+
+// Configure the HTTP request pipeline.
+if (app.Environment.IsDevelopment())
 {
-    public class Program
-    {
-        public static void Main(string[] args)
+    app.UseSwagger();
+    app.UseSwaggerUI(
+        options =>
         {
-            var host = CreateHostBuilder(args).Build();
-
-            // Initializes db.
-            using (var scope = host.Services.CreateScope())
+            foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions)
             {
-                var services = scope.ServiceProvider;
-                try
-                {
-                    var context = services.GetRequiredService<FoodDbContext>();
-                    var dbInitializer = services.GetRequiredService<ISeedDataService>();
-                    dbInitializer.Initialize(context).GetAwaiter().GetResult();
-                }
-                catch (Exception ex)
-                {
-                    var logger = services.GetRequiredService<ILogger<Program>>();
-                    logger.LogError(ex, "An error occurred while seeding the database.");
-                }
+                options.SwaggerEndpoint(
+                    $"/swagger/{description.GroupName}/swagger.json",
+                    description.GroupName.ToUpperInvariant());
             }
+        });
 
-            host.Run();
-        }
-
-        public static IHostBuilder CreateHostBuilder(string[] args) =>
-           Host.CreateDefaultBuilder(args)
-               .ConfigureWebHostDefaults(webBuilder =>
-               {
-                   webBuilder.UseStartup<Startup>();
-               });
-    }
+    app.SeedData();
+} 
+else
+{
+    app.AddProductionExceptionHandling(loggerFactory);
 }
+
+app.UseCors("AllowAllOrigins");
+app.UseHttpsRedirection();
+
+app.UseAuthorization();
+
+app.MapControllers();
+
+app.Run();
diff --git a/SampleWebApiAspNetCore/Properties/launchSettings.json b/SampleWebApiAspNetCore/Properties/launchSettings.json
index 1656128..9795820 100644
--- a/SampleWebApiAspNetCore/Properties/launchSettings.json
+++ b/SampleWebApiAspNetCore/Properties/launchSettings.json
@@ -1,30 +1,31 @@
 ﻿{
-  "$schema": "http://json.schemastore.org/launchsettings.json",
+  "$schema": "https://json.schemastore.org/launchsettings.json",
   "iisSettings": {
     "windowsAuthentication": false,
     "anonymousAuthentication": true,
     "iisExpress": {
-      "applicationUrl": "http://localhost:62972",
-      "sslPort": 44378
+      "applicationUrl": "http://localhost:27813",
+      "sslPort": 44341
     }
   },
   "profiles": {
-    "IIS Express": {
-      "commandName": "IISExpress",
+    "SampleWebApiAspNetCore": {
+      "commandName": "Project",
+      "dotnetRunMessages": true,
       "launchBrowser": true,
       "launchUrl": "swagger",
+      "applicationUrl": "https://localhost:7124;http://localhost:5124",
       "environmentVariables": {
         "ASPNETCORE_ENVIRONMENT": "Development"
       }
     },
-    "SampleWebApiAspNetCore": {
-      "commandName": "Project",
+    "IIS Express": {
+      "commandName": "IISExpress",
       "launchBrowser": true,
       "launchUrl": "swagger",
-      "applicationUrl": "https://localhost:5001;http://localhost:5000",
       "environmentVariables": {
         "ASPNETCORE_ENVIRONMENT": "Development"
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/SampleWebApiAspNetCore/Repositories/FoodDbContext.cs b/SampleWebApiAspNetCore/Repositories/FoodDbContext.cs
index 4fd0648..86187b7 100644
--- a/SampleWebApiAspNetCore/Repositories/FoodDbContext.cs
+++ b/SampleWebApiAspNetCore/Repositories/FoodDbContext.cs
@@ -6,12 +6,10 @@ namespace SampleWebApiAspNetCore.Repositories
     public class FoodDbContext : DbContext
     {
         public FoodDbContext(DbContextOptions<FoodDbContext> options)
-           : base(options)
+            : base(options)
         {
-
         }
 
-        public DbSet<FoodEntity> FoodItems { get; set; }
-
+        public DbSet<FoodEntity> FoodItems { get; set; } = null!;
     }
 }
diff --git a/SampleWebApiAspNetCore/Repositories/FoodSqlRepository.cs b/SampleWebApiAspNetCore/Repositories/FoodSqlRepository.cs
index 3fa6de6..5ace322 100644
--- a/SampleWebApiAspNetCore/Repositories/FoodSqlRepository.cs
+++ b/SampleWebApiAspNetCore/Repositories/FoodSqlRepository.cs
@@ -1,9 +1,6 @@
 ﻿using SampleWebApiAspNetCore.Entities;
 using SampleWebApiAspNetCore.Helpers;
 using SampleWebApiAspNetCore.Models;
-using System;
-using System.Collections.Generic;
-using System.Linq;
 using System.Linq.Dynamic.Core;
 
 namespace SampleWebApiAspNetCore.Repositories
diff --git a/SampleWebApiAspNetCore/Repositories/IFoodRepository.cs b/SampleWebApiAspNetCore/Repositories/IFoodRepository.cs
index a79368e..26574b2 100644
--- a/SampleWebApiAspNetCore/Repositories/IFoodRepository.cs
+++ b/SampleWebApiAspNetCore/Repositories/IFoodRepository.cs
@@ -1,6 +1,4 @@
-﻿using System.Collections.Generic;
-using System.Linq;
-using SampleWebApiAspNetCore.Entities;
+﻿using SampleWebApiAspNetCore.Entities;
 using SampleWebApiAspNetCore.Models;
 
 namespace SampleWebApiAspNetCore.Repositories
@@ -12,10 +10,8 @@ public interface IFoodRepository
         void Delete(int id);
         FoodEntity Update(int id, FoodEntity item);
         IQueryable<FoodEntity> GetAll(QueryParameters queryParameters);
-
         ICollection<FoodEntity> GetRandomMeal();
         int Count();
-
         bool Save();
     }
 }
diff --git a/SampleWebApiAspNetCore/SampleWebApiAspNetCore.csproj b/SampleWebApiAspNetCore/SampleWebApiAspNetCore.csproj
index 5423ff9..0d035e5 100644
--- a/SampleWebApiAspNetCore/SampleWebApiAspNetCore.csproj
+++ b/SampleWebApiAspNetCore/SampleWebApiAspNetCore.csproj
@@ -1,27 +1,20 @@
 ﻿<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
-    <TargetFramework>net5.0</TargetFramework>
+    <TargetFramework>net9.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
   </PropertyGroup>
 
   <ItemGroup>
-    <Folder Include="wwwroot\" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <PackageReference Include="AutoMapper" Version="10.1.1" />
-    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="8.1.0" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.2.0" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="4.2.0" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="5.0.0" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0">
-      <PrivateAssets>all</PrivateAssets>
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
-    </PackageReference>
-    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
-    <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.5" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.0" />
+    <PackageReference Include="Mapster" Version="7.4.0" />
+    <PackageReference Include="Mapster.DependencyInjection" Version="1.0.1" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.8" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="5.1.0" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="5.1.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="9.0.8" />
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.3" />
+    <PackageReference Include="System.Linq.Dynamic.Core" Version="1.6.7" />
   </ItemGroup>
 
 </Project>
diff --git a/SampleWebApiAspNetCore/Services/ILinkService.cs b/SampleWebApiAspNetCore/Services/ILinkService.cs
new file mode 100644
index 0000000..053954f
--- /dev/null
+++ b/SampleWebApiAspNetCore/Services/ILinkService.cs
@@ -0,0 +1,12 @@
+﻿using Microsoft.AspNetCore.Mvc;
+using SampleWebApiAspNetCore.Models;
+
+namespace SampleWebApiAspNetCore.Services
+{
+    public interface ILinkService<T>
+    {
+        object ExpandSingleFoodItem(object resource, int identifier, ApiVersion version);
+
+        List<LinkDto> CreateLinksForCollection(QueryParameters queryParameters, int totalCount, ApiVersion version);
+    }
+}
diff --git a/SampleWebApiAspNetCore/Services/ISeedDataService.cs b/SampleWebApiAspNetCore/Services/ISeedDataService.cs
index af8962b..c649c8e 100644
--- a/SampleWebApiAspNetCore/Services/ISeedDataService.cs
+++ b/SampleWebApiAspNetCore/Services/ISeedDataService.cs
@@ -1,10 +1,9 @@
 ﻿using SampleWebApiAspNetCore.Repositories;
-using System.Threading.Tasks;
 
 namespace SampleWebApiAspNetCore.Services
 {
     public interface ISeedDataService
     {
-        Task Initialize(FoodDbContext context);
+        void Initialize(FoodDbContext context);
     }
 }
diff --git a/SampleWebApiAspNetCore/Services/LinkService.cs b/SampleWebApiAspNetCore/Services/LinkService.cs
new file mode 100644
index 0000000..38ad422
--- /dev/null
+++ b/SampleWebApiAspNetCore/Services/LinkService.cs
@@ -0,0 +1,150 @@
+﻿using Microsoft.AspNetCore.Mvc;
+using SampleWebApiAspNetCore.Models;
+using SampleWebApiAspNetCore.Helpers;
+using System.Reflection;
+using Microsoft.AspNetCore.Mvc.Routing;
+using Microsoft.AspNetCore.Mvc.Infrastructure;
+
+namespace SampleWebApiAspNetCore.Services
+{
+    public class LinkService<T> : ILinkService<T>
+    {
+        private readonly IUrlHelper _urlHelper;
+
+        public LinkService(IUrlHelperFactory urlHelperFactory, IActionContextAccessor actionContextAccessor)
+        {
+            _urlHelper = urlHelperFactory.GetUrlHelper(actionContextAccessor.ActionContext);
+        }
+
+        public List<LinkDto> CreateLinksForCollection(QueryParameters queryParameters, int totalCount, ApiVersion version)
+        {
+            Type controllerType = (typeof(T));
+            MethodInfo[] methods = controllerType.GetMethods();
+
+            var links = new List<LinkDto>();
+            var getAllMethodName = GetMethod(methods, typeof(HttpGetAttribute), 0);
+
+            // self 
+            links.Add(new LinkDto(_urlHelper.Link(getAllMethodName, new
+            {
+                pagecount = queryParameters.PageCount,
+                page = queryParameters.Page,
+                orderby = queryParameters.OrderBy
+            }), "self", "GET"));
+
+            links.Add(new LinkDto(_urlHelper.Link(getAllMethodName, new
+            {
+                pagecount = queryParameters.PageCount,
+                page = 1,
+                orderby = queryParameters.OrderBy
+            }), "first", "GET"));
+
+            links.Add(new LinkDto(_urlHelper.Link(getAllMethodName, new
+            {
+                pagecount = queryParameters.PageCount,
+                page = queryParameters.GetTotalPages(totalCount),
+                orderby = queryParameters.OrderBy
+            }), "last", "GET"));
+
+            if (queryParameters.HasNext(totalCount))
+            {
+                links.Add(new LinkDto(_urlHelper.Link(getAllMethodName, new
+                {
+                    pagecount = queryParameters.PageCount,
+                    page = queryParameters.Page + 1,
+                    orderby = queryParameters.OrderBy
+                }), "next", "GET"));
+            }
+
+            if (queryParameters.HasPrevious())
+            {
+                links.Add(new LinkDto(_urlHelper.Link(getAllMethodName, new
+                {
+                    pagecount = queryParameters.PageCount,
+                    page = queryParameters.Page - 1,
+                    orderby = queryParameters.OrderBy
+                }), "previous", "GET"));
+            }
+
+            var posturl = _urlHelper.Link(GetMethod(methods, typeof(HttpPostAttribute)), new { version = version.ToString() });
+
+            links.Add(
+               new LinkDto(posturl,
+               "create",
+               "POST"));
+
+            return links;
+        }
+
+        public object ExpandSingleFoodItem(object resource, int identifier, ApiVersion version)
+        {
+            var resourceToReturn = resource.ToDynamic() as IDictionary<string, object>;
+
+            var links = GetLinksForSingleItem(identifier, version);
+
+            resourceToReturn.Add("links", links);
+
+            return resourceToReturn;
+        }
+
+
+        private IEnumerable<LinkDto> GetLinksForSingleItem(int id, ApiVersion version)
+        {
+            Type myType = (typeof(T));
+            MethodInfo[] methods = myType.GetMethods();
+            var links = new List<LinkDto>();
+
+            var getLink = _urlHelper.Link(GetMethod(methods, typeof(HttpGetAttribute), 1), new { version = version.ToString(), id = id });
+            links.Add(new LinkDto(getLink, "self", "GET"));
+
+            var deleteLink = _urlHelper.Link(GetMethod(methods, typeof(HttpDeleteAttribute)), new { version = version.ToString(), id = id });
+            links.Add(
+              new LinkDto(deleteLink,
+              "delete",
+              "DELETE"));
+
+            var createLink = _urlHelper.Link(GetMethod(methods, typeof(HttpPostAttribute)), new { version = version.ToString() });
+            links.Add(
+              new LinkDto(createLink,
+              "create_food",
+              "POST"));
+
+            var updateLink = _urlHelper.Link(GetMethod(methods, typeof(HttpPutAttribute)), new { version = version.ToString(), id = id });
+            links.Add(
+               new LinkDto(updateLink,
+               "update_food",
+               "PUT"));
+
+            return links;
+        }
+
+        private string GetMethod(MethodInfo[] methods, Type type, int routeParamsLength = 0)
+        {
+            var filteredMethods = methods.Where(m => m.GetCustomAttributes(type, false).Length > 0).ToArray();
+
+            if (filteredMethods.Length == 0)
+            {
+                return "";
+            }
+
+            if (routeParamsLength == 0)
+            {
+                var toReturn = filteredMethods.FirstOrDefault();
+
+                return toReturn is not null ? toReturn.Name : "";
+            }
+
+            foreach (var method in filteredMethods)
+            {
+                var routeAttribs = method.GetCustomAttributes(typeof(RouteAttribute));
+
+                if (routeAttribs.Count() == routeParamsLength)
+                {
+                    return method.Name;
+                }
+            }
+
+            return "";
+        }
+    }
+}
diff --git a/SampleWebApiAspNetCore/Services/SeedDataService.cs b/SampleWebApiAspNetCore/Services/SeedDataService.cs
index 152ae03..2ac7cc4 100644
--- a/SampleWebApiAspNetCore/Services/SeedDataService.cs
+++ b/SampleWebApiAspNetCore/Services/SeedDataService.cs
@@ -1,20 +1,18 @@
 ﻿using SampleWebApiAspNetCore.Entities;
 using SampleWebApiAspNetCore.Repositories;
-using System;
-using System.Threading.Tasks;
 
 namespace SampleWebApiAspNetCore.Services
 {
     public class SeedDataService : ISeedDataService
     {
-        public async Task Initialize(FoodDbContext context)
+        public void Initialize(FoodDbContext context)
         {
             context.FoodItems.Add(new FoodEntity() { Calories = 1000, Type = "Starter", Name = "Lasagne", Created = DateTime.Now });
             context.FoodItems.Add(new FoodEntity() { Calories = 1100, Type = "Main", Name = "Hamburger", Created = DateTime.Now });
             context.FoodItems.Add(new FoodEntity() { Calories = 1200, Type = "Dessert", Name = "Spaghetti", Created = DateTime.Now });
             context.FoodItems.Add(new FoodEntity() { Calories = 1300, Type = "Starter", Name = "Pizza", Created = DateTime.Now });
 
-            await context.SaveChangesAsync();
+            context.SaveChanges();
         }
     }
 }
diff --git a/SampleWebApiAspNetCore/Startup.cs b/SampleWebApiAspNetCore/Startup.cs
deleted file mode 100644
index ebaff9d..0000000
--- a/SampleWebApiAspNetCore/Startup.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-﻿using AutoMapper;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Diagnostics;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.ApiExplorer;
-using Microsoft.AspNetCore.Mvc.Infrastructure;
-using Microsoft.AspNetCore.Mvc.Routing;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-using Newtonsoft.Json.Serialization;
-using SampleWebApiAspNetCore.Helpers;
-using SampleWebApiAspNetCore.MappingProfiles;
-using SampleWebApiAspNetCore.Repositories;
-using SampleWebApiAspNetCore.Services;
-using Swashbuckle.AspNetCore.SwaggerGen;
-
-namespace SampleWebApiAspNetCore
-{
-    public class Startup
-    {
-        public Startup(IConfiguration configuration)
-        {
-            Configuration = configuration;
-        }
-
-        public IConfiguration Configuration { get; }
-
-        // This method gets called by the runtime. Use this method to add services to the container.
-        public void ConfigureServices(IServiceCollection services)
-        {
-            services.AddOptions();
-            services.AddDbContext<FoodDbContext>(opt => opt.UseInMemoryDatabase("FoodDatabase"));
-            services.AddCustomCors("AllowAllOrigins");
-
-            services.AddSingleton<ISeedDataService, SeedDataService>();
-            services.AddScoped<IFoodRepository, FoodSqlRepository>();
-            services.AddRouting(options => options.LowercaseUrls = true);
-            services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
-            services.AddScoped<IUrlHelper>(x =>
-            {
-                var actionContext = x.GetRequiredService<IActionContextAccessor>().ActionContext;
-                var factory = x.GetRequiredService<IUrlHelperFactory>();
-                return factory.GetUrlHelper(actionContext);
-            });
-            
-            services.AddControllers()
-                   .AddNewtonsoftJson(options =>
-                       options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver())
-                            .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
-
-            services.AddVersioning();
-            services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();
-            services.AddSwaggerGen();
-
-            services.AddAutoMapper(typeof(FoodMappings));
-        }
-
-        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
-        public void Configure(
-            IApplicationBuilder app, 
-            ILoggerFactory loggerFactory, 
-            IWebHostEnvironment env, 
-            IApiVersionDescriptionProvider provider)
-        {
-            if (env.IsDevelopment())
-            {
-                app.UseDeveloperExceptionPage();
-            }
-            else
-            {
-                app.UseHsts();
-                app.AddProductionExceptionHandling(loggerFactory);
-            }
-
-            app.UseHttpsRedirection();
-            app.UseRouting();
-            app.UseCors("AllowAllOrigins");
-
-            app.UseEndpoints(endpoints =>
-            {
-                endpoints.MapControllers();
-            });
-
-            app.UseSwagger();
-            app.UseSwaggerUI(
-                options =>
-                {
-                    foreach (var description in provider.ApiVersionDescriptions)
-                    {
-                        options.SwaggerEndpoint(
-                            $"/swagger/{description.GroupName}/swagger.json",
-                            description.GroupName.ToUpperInvariant());
-                    }
-                });
-        }
-    }
-}
diff --git a/SampleWebApiAspNetCore/appsettings.Development.json b/SampleWebApiAspNetCore/appsettings.Development.json
index e203e94..0c208ae 100644
--- a/SampleWebApiAspNetCore/appsettings.Development.json
+++ b/SampleWebApiAspNetCore/appsettings.Development.json
@@ -1,9 +1,8 @@
 {
   "Logging": {
     "LogLevel": {
-      "Default": "Debug",
-      "System": "Information",
-      "Microsoft": "Information"
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
     }
   }
 }
diff --git a/SampleWebApiAspNetCore/appsettings.json b/SampleWebApiAspNetCore/appsettings.json
index def9159..10f68b8 100644
--- a/SampleWebApiAspNetCore/appsettings.json
+++ b/SampleWebApiAspNetCore/appsettings.json
@@ -1,7 +1,8 @@
 {
   "Logging": {
     "LogLevel": {
-      "Default": "Warning"
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
     }
   },
   "AllowedHosts": "*"
diff --git a/docker_compse.yml b/docker_compse.yml
new file mode 100644
index 0000000..b68e0ad
--- /dev/null
+++ b/docker_compse.yml
@@ -0,0 +1,8 @@
+docker composefile 
+
+version: '3.8'
+services:
+  webapi:
+    build: .
+    ports:
+      - "5000:5000"
diff --git a/dockerfile b/dockerfile
new file mode 100644
index 0000000..6c2c1dc
--- /dev/null
+++ b/dockerfile
@@ -0,0 +1,8 @@
+
+FROM mcr.microsoft.com/dotnet/sdk:6.0
+WORKDIR /app
+COPY . .
+RUN dotnet restore && dotnet publish -c Release -o out
+WORKDIR /app/out
+EXPOSE 5000
+ENTRYPOINT ["dotnet", "ASPNETCore-WebAPI-Sample.dll"]
