├── OrderManagementConsole ├── .gitignore ├── Interfaces │ ├── IOrderManager.cs │ └── IOrderSender.cs ├── Managers │ ├── OrderManager.cs │ └── OrderSender.cs ├── Models │ ├── Order.cs │ └── OrderItem.cs ├── OrderManagementConsole.csproj ├── OrderManagementConsole.sln └── Program.cs ├── OrderManagementWeb ├── .gitignore ├── Controllers │ └── OrderController.cs ├── Interfaces │ ├── IOrderManager.cs │ └── IOrderSender.cs ├── Managers │ ├── OrderManager.cs │ └── OrderSender.cs ├── Models │ ├── Order.cs │ └── OrderItem.cs ├── OrderManagement.csproj ├── OrderManagement.sln ├── Program.cs ├── Properties │ └── launchSettings.json ├── Startup.cs ├── appsettings.Development.json └── appsettings.json └── README.md /OrderManagementConsole/.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | *.*~ 3 | project.lock.json 4 | .DS_Store 5 | *.pyc 6 | 7 | # Visual Studio Code 8 | .vscode 9 | 10 | # User-specific files 11 | *.suo 12 | *.user 13 | *.userosscache 14 | *.sln.docstates 15 | *.vs 16 | 17 | # Build results 18 | [Dd]ebug/ 19 | [Dd]ebugPublic/ 20 | [Rr]elease/ 21 | [Rr]eleases/ 22 | x64/ 23 | x86/ 24 | build/ 25 | bld/ 26 | [Bb]in/ 27 | [Oo]bj/ 28 | msbuild.log 29 | msbuild.err 30 | msbuild.wrn -------------------------------------------------------------------------------- /OrderManagementConsole/Interfaces/IOrderManager.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using OrderManagement.Models; 3 | 4 | namespace OrderManagement.Interfaces 5 | { 6 | public interface IOrderManager 7 | { 8 | public Task Transmit(Order order); 9 | } 10 | } -------------------------------------------------------------------------------- /OrderManagementConsole/Interfaces/IOrderSender.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using OrderManagement.Models; 3 | 4 | namespace OrderManagement.Interfaces 5 | { 6 | public interface IOrderSender 7 | { 8 | Task Send(Order order); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /OrderManagementConsole/Managers/OrderManager.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using OrderManagement.Interfaces; 3 | using OrderManagement.Models; 4 | 5 | namespace OrderManagement 6 | { 7 | public class OrderManager : IOrderManager 8 | { 9 | private IOrderSender orderSender; 10 | 11 | public OrderManager(IOrderSender sender) 12 | { 13 | orderSender = sender; 14 | } 15 | 16 | public async Task Transmit(Order order) 17 | { 18 | return await orderSender.Send(order); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /OrderManagementConsole/Managers/OrderSender.cs: -------------------------------------------------------------------------------- 1 | using System.Net.Http; 2 | using System.Text; 3 | using System.Text.Json; 4 | using System.Threading.Tasks; 5 | using OrderManagement.Interfaces; 6 | using OrderManagement.Models; 7 | 8 | namespace OrderManagement 9 | { 10 | public class HttpOrderSender : IOrderSender 11 | { 12 | private static readonly HttpClient httpClient = new HttpClient(); 13 | 14 | public async Task Send(Order order) 15 | { 16 | var jsonOrder = JsonSerializer.Serialize(order); 17 | var stringContent = new StringContent(jsonOrder, UnicodeEncoding.UTF8, "application/json"); 18 | 19 | //This statement calls a not existing URL. This is just an example... 20 | var response = await httpClient.PostAsync("https://mymicroservice.lan/myendpoint", stringContent); 21 | 22 | return response.Content.ReadAsStringAsync().Result; 23 | 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /OrderManagementConsole/Models/Order.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace OrderManagement.Models 5 | { 6 | public class Order 7 | { 8 | public string CustomerId { get; set; } 9 | public DateTime Date { get; set; } 10 | public decimal TotalAmount { get; set; } 11 | public List Items { get; set; } 12 | 13 | public Order() 14 | { 15 | Items = new List(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /OrderManagementConsole/Models/OrderItem.cs: -------------------------------------------------------------------------------- 1 | namespace OrderManagement.Models 2 | { 3 | public class OrderItem 4 | { 5 | public string ItemId { get; set; } 6 | public decimal Quantity { get; set; } 7 | public decimal Price { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /OrderManagementConsole/OrderManagementConsole.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | netcoreapp3.1 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /OrderManagementConsole/OrderManagementConsole.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrderManagementConsole", "OrderManagementConsole.csproj", "{589DAC0A-48E2-43DB-ACAD-DD67DD2446A1}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Any CPU = Debug|Any CPU 9 | Release|Any CPU = Release|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {589DAC0A-48E2-43DB-ACAD-DD67DD2446A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {589DAC0A-48E2-43DB-ACAD-DD67DD2446A1}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {589DAC0A-48E2-43DB-ACAD-DD67DD2446A1}.Release|Any CPU.ActiveCfg = Release|Any CPU 15 | {589DAC0A-48E2-43DB-ACAD-DD67DD2446A1}.Release|Any CPU.Build.0 = Release|Any CPU 16 | EndGlobalSection 17 | EndGlobal 18 | -------------------------------------------------------------------------------- /OrderManagementConsole/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Extensions.DependencyInjection; 3 | using OrderManagement; 4 | using OrderManagement.Interfaces; 5 | using OrderManagement.Models; 6 | 7 | namespace OrderManagementConsole 8 | { 9 | class Program 10 | { 11 | private static IServiceProvider serviceProvider; 12 | 13 | static void Main(string[] args) 14 | { 15 | ConfigureServices(); 16 | 17 | var orderManager = serviceProvider.GetService(); 18 | var order = CreateOrder(); 19 | 20 | orderManager.Transmit(order); 21 | } 22 | 23 | private static void ConfigureServices() 24 | { 25 | var services = new ServiceCollection(); 26 | 27 | services.AddTransient(); 28 | services.AddTransient(); 29 | 30 | serviceProvider = services.BuildServiceProvider(); 31 | } 32 | 33 | private static Order CreateOrder() 34 | { 35 | return new Order { 36 | CustomerId = "12345", 37 | Date = new DateTime(), 38 | TotalAmount = 145, 39 | Items = new System.Collections.Generic.List 40 | { 41 | new OrderItem { 42 | ItemId = "99999", 43 | Quantity = 1, 44 | Price = 145 45 | } 46 | } 47 | }; 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /OrderManagementWeb/.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | *.*~ 3 | project.lock.json 4 | .DS_Store 5 | *.pyc 6 | 7 | # Visual Studio Code 8 | .vscode 9 | 10 | # User-specific files 11 | *.suo 12 | *.user 13 | *.userosscache 14 | *.sln.docstates 15 | *.vs 16 | 17 | # Build results 18 | [Dd]ebug/ 19 | [Dd]ebugPublic/ 20 | [Rr]elease/ 21 | [Rr]eleases/ 22 | x64/ 23 | x86/ 24 | build/ 25 | bld/ 26 | [Bb]in/ 27 | [Oo]bj/ 28 | msbuild.log 29 | msbuild.err 30 | msbuild.wrn -------------------------------------------------------------------------------- /OrderManagementWeb/Controllers/OrderController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | using OrderManagement.Interfaces; 3 | using OrderManagement.Models; 4 | 5 | namespace OrderManagement.Controllers 6 | { 7 | [Route("api/[controller]")] 8 | [ApiController] 9 | public class OrderController : ControllerBase 10 | { 11 | private IOrderManager orderManager; 12 | 13 | public OrderController(IOrderManager orderMngr) 14 | { 15 | orderManager = orderMngr; 16 | } 17 | 18 | [HttpPost] 19 | public ActionResult Post(Order order) 20 | { 21 | return Ok(orderManager.Transmit(order)); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /OrderManagementWeb/Interfaces/IOrderManager.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using OrderManagement.Models; 3 | 4 | namespace OrderManagement.Interfaces 5 | { 6 | public interface IOrderManager 7 | { 8 | public Task Transmit(Order order); 9 | } 10 | } -------------------------------------------------------------------------------- /OrderManagementWeb/Interfaces/IOrderSender.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using OrderManagement.Models; 3 | 4 | namespace OrderManagement.Interfaces 5 | { 6 | public interface IOrderSender 7 | { 8 | Task Send(Order order); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /OrderManagementWeb/Managers/OrderManager.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using OrderManagement.Interfaces; 3 | using OrderManagement.Models; 4 | 5 | namespace OrderManagement 6 | { 7 | public class OrderManager : IOrderManager 8 | { 9 | private IOrderSender orderSender; 10 | 11 | public OrderManager(IOrderSender sender) 12 | { 13 | orderSender = sender; 14 | } 15 | 16 | public async Task Transmit(Order order) 17 | { 18 | return await orderSender.Send(order); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /OrderManagementWeb/Managers/OrderSender.cs: -------------------------------------------------------------------------------- 1 | using System.Net.Http; 2 | using System.Text; 3 | using System.Text.Json; 4 | using System.Threading.Tasks; 5 | using OrderManagement.Interfaces; 6 | using OrderManagement.Models; 7 | 8 | namespace OrderManagement 9 | { 10 | public class HttpOrderSender : IOrderSender 11 | { 12 | private static readonly HttpClient httpClient = new HttpClient(); 13 | 14 | public async Task Send(Order order) 15 | { 16 | var jsonOrder = JsonSerializer.Serialize(order); 17 | var stringContent = new StringContent(jsonOrder, UnicodeEncoding.UTF8, "application/json"); 18 | 19 | //This statement calls a not existing URL. This is just an example... 20 | var response = await httpClient.PostAsync("https://mymicroservice.lan/myendpoint", stringContent); 21 | 22 | return response.Content.ReadAsStringAsync().Result; 23 | 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /OrderManagementWeb/Models/Order.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace OrderManagement.Models 5 | { 6 | public class Order 7 | { 8 | public string CustomerId { get; set; } 9 | public DateTime Date { get; set; } 10 | public decimal TotalAmount { get; set; } 11 | public List Items { get; set; } 12 | 13 | public Order() 14 | { 15 | Items = new List(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /OrderManagementWeb/Models/OrderItem.cs: -------------------------------------------------------------------------------- 1 | namespace OrderManagement.Models 2 | { 3 | public class OrderItem 4 | { 5 | public string ItemId { get; set; } 6 | public decimal Quantity { get; set; } 7 | public decimal Price { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /OrderManagementWeb/OrderManagement.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp3.1 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /OrderManagementWeb/OrderManagement.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrderManagement", "OrderManagement.csproj", "{28BF8347-3CF8-4B0D-8D26-8D6B8355758B}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Any CPU = Debug|Any CPU 9 | Release|Any CPU = Release|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {28BF8347-3CF8-4B0D-8D26-8D6B8355758B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {28BF8347-3CF8-4B0D-8D26-8D6B8355758B}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {28BF8347-3CF8-4B0D-8D26-8D6B8355758B}.Release|Any CPU.ActiveCfg = Release|Any CPU 15 | {28BF8347-3CF8-4B0D-8D26-8D6B8355758B}.Release|Any CPU.Build.0 = Release|Any CPU 16 | EndGlobalSection 17 | EndGlobal 18 | -------------------------------------------------------------------------------- /OrderManagementWeb/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Hosting; 6 | using Microsoft.Extensions.Configuration; 7 | using Microsoft.Extensions.Hosting; 8 | using Microsoft.Extensions.Logging; 9 | 10 | namespace OrderManagement 11 | { 12 | public class Program 13 | { 14 | public static void Main(string[] args) 15 | { 16 | CreateHostBuilder(args).Build().Run(); 17 | } 18 | 19 | public static IHostBuilder CreateHostBuilder(string[] args) => 20 | Host.CreateDefaultBuilder(args) 21 | .ConfigureWebHostDefaults(webBuilder => 22 | { 23 | webBuilder.UseStartup(); 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /OrderManagementWeb/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/launchsettings.json", 3 | "iisSettings": { 4 | "windowsAuthentication": false, 5 | "anonymousAuthentication": true, 6 | "iisExpress": { 7 | "applicationUrl": "http://localhost:30559", 8 | "sslPort": 44359 9 | } 10 | }, 11 | "profiles": { 12 | "IIS Express": { 13 | "commandName": "IISExpress", 14 | "launchBrowser": true, 15 | "launchUrl": "weatherforecast", 16 | "environmentVariables": { 17 | "ASPNETCORE_ENVIRONMENT": "Development" 18 | } 19 | }, 20 | "OrderManagement": { 21 | "commandName": "Project", 22 | "launchBrowser": true, 23 | "launchUrl": "api/order", 24 | "environmentVariables": { 25 | "ASPNETCORE_ENVIRONMENT": "Development" 26 | }, 27 | "applicationUrl": "https://localhost:5001;http://localhost:5000" 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /OrderManagementWeb/Startup.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Builder; 2 | using Microsoft.AspNetCore.Hosting; 3 | using Microsoft.Extensions.Configuration; 4 | using Microsoft.Extensions.DependencyInjection; 5 | using Microsoft.Extensions.Hosting; 6 | 7 | namespace OrderManagement 8 | { 9 | public class Startup 10 | { 11 | public Startup(IConfiguration configuration) 12 | { 13 | Configuration = configuration; 14 | } 15 | 16 | public IConfiguration Configuration { get; } 17 | 18 | // This method gets called by the runtime. Use this method to add services to the container. 19 | public void ConfigureServices(IServiceCollection services) 20 | { 21 | services.AddControllers(); 22 | 23 | services.AddScoped(); 24 | services.AddScoped(); 25 | } 26 | 27 | // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 28 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 29 | { 30 | if (env.IsDevelopment()) 31 | { 32 | app.UseDeveloperExceptionPage(); 33 | } 34 | 35 | app.UseHttpsRedirection(); 36 | 37 | app.UseRouting(); 38 | 39 | app.UseAuthorization(); 40 | 41 | app.UseEndpoints(endpoints => 42 | { 43 | endpoints.MapControllers(); 44 | }); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /OrderManagementWeb/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft": "Warning", 6 | "Microsoft.Hosting.Lifetime": "Information" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /OrderManagementWeb/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft": "Warning", 6 | "Microsoft.Hosting.Lifetime": "Information" 7 | } 8 | }, 9 | "AllowedHosts": "*" 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This repository contains two .NET Core projects showing how to use Dependency Injection in .NET Core: 2 | 3 | - `OrderManagementWeb`: an ASP.NET application. 4 | - `OrderManagementConsole:`: a Console application. 5 | 6 | The code is not meant to run, but just to support the article [Understanding Dependency Injection in .NET Core](https://auth0.com/blog/dependency-injection-in-dotnet-core). 7 | 8 | ## Requirements: 9 | 10 | - [.NET Core 3.0 or above](https://dotnet.microsoft.com/download) installed on your machine 11 | 12 | 13 | --------------------------------------------------------------------------------