Skip to content

Commit ac981f3

Browse files
committed
added AspnetRunBasics
1 parent 0a43e1a commit ac981f3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+2791
-0
lines changed

run-aspnetcore-microservices.sln

+10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApiGateway", "ApiGateway",
3333
EndProject
3434
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APIGateway", "src\ApiGateway\APIGateway\APIGateway.csproj", "{861423CF-AB49-4A41-8DA8-B4E63EF077EC}"
3535
EndProject
36+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebApp", "WebApp", "{24069E8F-88D9-4852-ADAC-AE97F29D220F}"
37+
EndProject
38+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AspnetRunBasics", "src\WebApp\AspnetRunBasics\AspnetRunBasics.csproj", "{C50AF8FE-27B0-4CC7-A0E5-62CAD1205567}"
39+
EndProject
3640
Global
3741
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3842
Debug|Any CPU = Debug|Any CPU
@@ -75,6 +79,10 @@ Global
7579
{861423CF-AB49-4A41-8DA8-B4E63EF077EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
7680
{861423CF-AB49-4A41-8DA8-B4E63EF077EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
7781
{861423CF-AB49-4A41-8DA8-B4E63EF077EC}.Release|Any CPU.Build.0 = Release|Any CPU
82+
{C50AF8FE-27B0-4CC7-A0E5-62CAD1205567}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
83+
{C50AF8FE-27B0-4CC7-A0E5-62CAD1205567}.Debug|Any CPU.Build.0 = Debug|Any CPU
84+
{C50AF8FE-27B0-4CC7-A0E5-62CAD1205567}.Release|Any CPU.ActiveCfg = Release|Any CPU
85+
{C50AF8FE-27B0-4CC7-A0E5-62CAD1205567}.Release|Any CPU.Build.0 = Release|Any CPU
7886
EndGlobalSection
7987
GlobalSection(SolutionProperties) = preSolution
8088
HideSolutionNode = FALSE
@@ -93,6 +101,8 @@ Global
93101
{F8F12D19-E4C1-4018-A947-7FA81DFFD4BC} = {4E0CBAE4-FC9D-4CFA-9BBA-DF50B9EC48A1}
94102
{F703CBBB-1C02-46A3-A84F-5D27604F2F61} = {1F32F974-1A66-4887-8DC2-A8BAB3AEE17D}
95103
{861423CF-AB49-4A41-8DA8-B4E63EF077EC} = {F703CBBB-1C02-46A3-A84F-5D27604F2F61}
104+
{24069E8F-88D9-4852-ADAC-AE97F29D220F} = {1F32F974-1A66-4887-8DC2-A8BAB3AEE17D}
105+
{C50AF8FE-27B0-4CC7-A0E5-62CAD1205567} = {24069E8F-88D9-4852-ADAC-AE97F29D220F}
96106
EndGlobalSection
97107
GlobalSection(ExtensibilityGlobals) = postSolution
98108
SolutionGuid = {976E779A-BDC9-44B4-A778-269979171BDE}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<Project Sdk="Microsoft.NET.Sdk.Web">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netcoreapp3.1</TargetFramework>
5+
<UserSecretsId>cd5124f0-00bb-4cff-b8b9-dc4e11396fa3</UserSecretsId>
6+
<DockerDefaultTargetOS>Windows</DockerDefaultTargetOS>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.1" />
11+
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="3.1.1" />
12+
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.1" />
13+
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.1">
14+
<PrivateAssets>all</PrivateAssets>
15+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
16+
</PackageReference>
17+
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.1" />
18+
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.9.10" />
19+
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" />
20+
</ItemGroup>
21+
22+
23+
24+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using AspnetRunBasics.Entities;
2+
using Microsoft.EntityFrameworkCore;
3+
4+
namespace AspnetRunBasics.Data
5+
{
6+
public class AspnetRunContext : DbContext
7+
{
8+
public AspnetRunContext(DbContextOptions<AspnetRunContext> options)
9+
: base(options)
10+
{
11+
}
12+
13+
public DbSet<Product> Products { get; set; }
14+
public DbSet<Category> Categories { get; set; }
15+
public DbSet<Cart> Carts { get; set; }
16+
public DbSet<CartItem> CartItems { get; set; }
17+
public DbSet<Order> Orders { get; set; }
18+
public DbSet<Contact> Contacts { get; set; }
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
using AspnetRunBasics.Entities;
2+
using Microsoft.Extensions.Logging;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Threading.Tasks;
7+
8+
namespace AspnetRunBasics.Data
9+
{
10+
public class AspnetRunContextSeed
11+
{
12+
public static async Task SeedAsync(AspnetRunContext aspnetrunContext, ILoggerFactory loggerFactory, int? retry = 0)
13+
{
14+
int retryForAvailability = retry.Value;
15+
16+
try
17+
{
18+
// TODO: Only run this if using a real database
19+
// aspnetrunContext.Database.Migrate();
20+
// aspnetrunContext.Database.EnsureCreated();
21+
22+
if (!aspnetrunContext.Categories.Any())
23+
{
24+
aspnetrunContext.Categories.AddRange(GetPreconfiguredCategories());
25+
await aspnetrunContext.SaveChangesAsync();
26+
}
27+
28+
if (!aspnetrunContext.Products.Any())
29+
{
30+
aspnetrunContext.Products.AddRange(GetPreconfiguredProducts());
31+
await aspnetrunContext.SaveChangesAsync();
32+
}
33+
}
34+
catch (Exception exception)
35+
{
36+
if (retryForAvailability < 10)
37+
{
38+
retryForAvailability++;
39+
var log = loggerFactory.CreateLogger<AspnetRunContextSeed>();
40+
log.LogError(exception.Message);
41+
await SeedAsync(aspnetrunContext, loggerFactory, retryForAvailability);
42+
}
43+
throw;
44+
}
45+
}
46+
47+
private static IEnumerable<Category> GetPreconfiguredCategories()
48+
{
49+
return new List<Category>()
50+
{
51+
new Category()
52+
{
53+
Name = "White Appliances",
54+
Description = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat.",
55+
ImageName = "one"
56+
},
57+
new Category()
58+
{
59+
Name = "Smart Watches",
60+
Description = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat.",
61+
ImageName = "two"
62+
},
63+
new Category()
64+
{
65+
Name = "Home & Kitchen",
66+
Description = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat.",
67+
ImageName = "tree"
68+
}
69+
};
70+
}
71+
72+
private static IEnumerable<Product> GetPreconfiguredProducts()
73+
{
74+
return new List<Product>()
75+
{
76+
new Product()
77+
{
78+
Name = "IPhone X",
79+
Summary = "This phone is the company's biggest change to its flagship smartphone in years. It includes a borderless.",
80+
Description = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.",
81+
ImageFile = "product-1.png",
82+
Price = 950.00M,
83+
CategoryId = 1
84+
},
85+
new Product()
86+
{
87+
Name = "Samsung 10",
88+
Summary = "This phone is the company's biggest change to its flagship smartphone in years. It includes a borderless.",
89+
Description = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.",
90+
ImageFile = "product-2.png",
91+
Price = 840.00M,
92+
CategoryId = 1
93+
},
94+
new Product()
95+
{
96+
Name = "Huawei Plus",
97+
Summary = "This phone is the company's biggest change to its flagship smartphone in years. It includes a borderless.",
98+
Description = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.",
99+
ImageFile = "product-3.png",
100+
Price = 650.00M,
101+
CategoryId = 2
102+
},
103+
new Product()
104+
{
105+
Name = "Xiaomi Mi 9",
106+
Summary = "This phone is the company's biggest change to its flagship smartphone in years. It includes a borderless.",
107+
Description = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.",
108+
ImageFile = "product-4.png",
109+
Price = 470.00M,
110+
CategoryId = 1
111+
},
112+
new Product()
113+
{
114+
Name = "HTC U11+ Plus",
115+
Summary = "This phone is the company's biggest change to its flagship smartphone in years. It includes a borderless.",
116+
Description = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.",
117+
ImageFile = "product-5.png",
118+
Price = 380.00M,
119+
CategoryId = 1
120+
},
121+
new Product()
122+
{
123+
Name = "LG G7 ThinQ",
124+
Summary = "This phone is the company's biggest change to its flagship smartphone in years. It includes a borderless.",
125+
Description = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut, tenetur natus doloremque laborum quos iste ipsum rerum obcaecati impedit odit illo dolorum ab tempora nihil dicta earum fugiat. Temporibus, voluptatibus.",
126+
ImageFile = "product-6.png",
127+
Price = 240.00M,
128+
CategoryId = 1
129+
}
130+
};
131+
}
132+
}
133+
}

src/WebApp/AspnetRunBasics/Dockerfile

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
2+
3+
#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed.
4+
#For more information, please see https://aka.ms/containercompat
5+
6+
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1709 AS base
7+
WORKDIR /app
8+
EXPOSE 80
9+
EXPOSE 443
10+
11+
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1709 AS build
12+
WORKDIR /src
13+
COPY ["AspnetRunBasics/AspnetRunBasics.csproj", "AspnetRunBasics/"]
14+
RUN dotnet restore "AspnetRunBasics/AspnetRunBasics.csproj"
15+
COPY . .
16+
WORKDIR "/src/AspnetRunBasics"
17+
RUN dotnet build "AspnetRunBasics.csproj" -c Release -o /app/build
18+
19+
FROM build AS publish
20+
RUN dotnet publish "AspnetRunBasics.csproj" -c Release -o /app/publish
21+
22+
FROM base AS final
23+
WORKDIR /app
24+
COPY --from=publish /app/publish .
25+
ENTRYPOINT ["dotnet", "AspnetRunBasics.dll"]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.Collections.Generic;
2+
3+
namespace AspnetRunBasics.Entities
4+
{
5+
public class Cart
6+
{
7+
public int Id { get; set; }
8+
public string UserName { get; set; }
9+
public List<CartItem> Items { get; set; } = new List<CartItem>();
10+
11+
public decimal TotalPrice
12+
{
13+
get
14+
{
15+
decimal totalprice = 0;
16+
foreach (var item in Items)
17+
{
18+
totalprice += item.Price * item.Quantity;
19+
}
20+
21+
return totalprice;
22+
}
23+
}
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace AspnetRunBasics.Entities
2+
{
3+
public class CartItem
4+
{
5+
public int Id { get; set; }
6+
public int Quantity { get; set; }
7+
public string Color { get; set; }
8+
public decimal Price { get; set; }
9+
public int ProductId { get; set; }
10+
public Product Product { get; set; }
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.ComponentModel.DataAnnotations;
2+
3+
namespace AspnetRunBasics.Entities
4+
{
5+
public class Category
6+
{
7+
public int Id { get; set; }
8+
9+
[Required, StringLength(80)]
10+
public string Name { get; set; }
11+
public string Description { get; set; }
12+
public string ImageName { get; set; }
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.ComponentModel.DataAnnotations;
2+
3+
namespace AspnetRunBasics.Entities
4+
{
5+
public class Contact
6+
{
7+
public int Id { get; set; }
8+
9+
[Required]
10+
public string Name { get; set; }
11+
12+
[Phone]
13+
[Required]
14+
public string Phone { get; set; }
15+
16+
[Required]
17+
public string Email { get; set; }
18+
19+
[MinLength(10)]
20+
[Required]
21+
public string Message { get; set; }
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
namespace AspnetRunBasics.Entities
2+
{
3+
public class Order
4+
{
5+
public int Id { get; set; }
6+
public string UserName { get; set; }
7+
public decimal TotalPrice { get; set; }
8+
9+
// BillingAddress
10+
public string FirstName { get; set; }
11+
public string LastName { get; set; }
12+
public string EmailAddress { get; set; }
13+
public string AddressLine { get; set; }
14+
public string Country { get; set; }
15+
public string State { get; set; }
16+
public string ZipCode { get; set; }
17+
18+
// Payment
19+
public string CardName { get; set; }
20+
public string CardNumber { get; set; }
21+
public string Expiration { get; set; }
22+
public string CVV { get; set; }
23+
public PaymentMethod PaymentMethod { get; set; }
24+
}
25+
26+
public enum PaymentMethod
27+
{
28+
CreditCard = 1,
29+
DebitCard = 2,
30+
Paypal = 3
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.ComponentModel.DataAnnotations;
2+
3+
namespace AspnetRunBasics.Entities
4+
{
5+
public class Product
6+
{
7+
public int Id { get; set; }
8+
9+
[Required, StringLength(80)]
10+
public string Name { get; set; }
11+
12+
public string Summary { get; set; }
13+
public string Description { get; set; }
14+
public string ImageFile { get; set; }
15+
public decimal Price { get; set; }
16+
public int CategoryId { get; set; }
17+
public Category Category { get; set; }
18+
}
19+
}

0 commit comments

Comments
 (0)