Learn to build an e-commerce app with .Net Core and Angular
Course description
Have you learnt the basics of ASP.NET Core and Angular? Not sure where to go next? This course should be able to help with that. In this course we start from nothing and build a proof of concept E-Commerce store using these frameworks.
Read more about the course
In this course we build a complete application from start to finish and every line of code is demonstrated and explained.
Here are some of the things you will learn about in this course:
Setting up the developer environment
Creating a multi project .net core application using the dotnet CLI
Creating a client side front-end Angular UI for the store using the Angular CLI
Learn how to use the Repository, Unit of Work and specification pattern in .net core
Using multiple DbContext as context boundaries
Using ASP.NET Identity for login and registration
Using the angular modules to create lazy loaded routes.
Using Automapper in ASP.NET Core
Building a great looking UI using Bootstrap
Making reusable form components using Angular Reactive forms
Paging, Sorting, Searching and Filtering
Using Redis to store the shopping basket
Creating orders from the shopping basket
Accepting payments via Stripe using the new EU standards for 3D secure
Publishing the application to Linux
Many more things as well
Tools you need for this course
In this course all the lessons are demonstrated using Visual Studio Code, a free cross platform code editor. You can of course use any IDE you like and any Operating system you like... as long as it's Windows, Linux or Mac.
Is this course for you?
This course is very practical, about 90%+ of the lessons will involve you coding along with me on this project. If you are the type of person who gets the most out of learning by doing, then this course is definitely for you.
Important: If you have never coded before and you want to learn .Net and Angular you would be better starting with my other .Net Core and Angular course before this one.
On this course we will build an example E-commerce store, completely from scratch using the DotNet CLI and the Angular CLI to help us get started. All you will need to get started is a computer with your favourite operating system, and a passion for learning how to build an application using ASP.NET Core and Angular.
- 3-6 Months prior coding experience
- Beginner and intermediate developers who want to enhance their knowledge of .Net and Angular who have some coding experience
- Beginner and intermediate developers who wish to learn how to build an e-commerce style of site
What you'll learn:
- .Net Core
- Angular
- C# Generics
- Repository and Unit of Work Pattern
- Specification Pattern
- Caching
- Angular Lazy loading
- Angular Routing
- Angular Reactive Forms
- Angular Creating a MultiStep form wizard
- Accepting payments using Stripe
- Angular Re-usable form components
- Angular validation and async validation
Watch Online
All Course Lessons (250)
| # | Lesson Title | Duration | Access |
|---|---|---|---|
| 1 | 1.1. Introduction to the course Demo | 07:51 | |
| 2 | 1.2. Setting up the developer environment | 05:00 | |
| 3 | 1.3. Setting up VS Code for C# development | 06:10 | |
| 4 | 1.4. Course assets and source code location | 03:21 | |
| 5 | 2.1. Introduction | 05:15 | |
| 6 | 2.2. Creating the .Net projects | 08:44 | |
| 7 | 2.3. Reviewing the projects in VS Code | 13:47 | |
| 8 | 2.4. Creating the Product Entity | 09:17 | |
| 9 | 2.5. Setting up entity framework | 06:28 | |
| 10 | 2.6. Setting up Sql Server | 09:25 | |
| 11 | 2.7. Connecting to the Sql Server from the app | 08:24 | |
| 12 | 2.8. Configuring the entities for the migration | 10:16 | |
| 13 | 2.9. Creating a products controller | 10:00 | |
| 14 | 2.10. Using postman to test our new API Endpoints | 06:31 | |
| 15 | 2.11. Adding the update and delete endpoints | 07:33 | |
| 16 | 2.12. Saving our code into source control | 08:02 | |
| 17 | 2.13. Summary | 07:04 | |
| 18 | 3.1. Introduction | 03:49 | |
| 19 | 3.2. Introduction to the repository pattern | 04:18 | |
| 20 | 3.3. Creating the repository interface and implementation class | 08:36 | |
| 21 | 3.4. Implementing the repository methods | 03:33 | |
| 22 | 3.5. Using the repository in the controller | 09:07 | |
| 23 | 3.6. Seeding data | 11:46 | |
| 24 | 3.7. Getting the brands and types | 05:04 | |
| 25 | 3.8. Filtering the products by brand | 05:12 | |
| 26 | 3.9. Sorting the products | 05:49 | |
| 27 | 3.10. Summary | 02:02 | |
| 28 | 4.1. Introduction | 07:24 | |
| 29 | 4.2. Creating a generic repository | 06:26 | |
| 30 | 4.3. Implementing the generic repository methods | 03:47 | |
| 31 | 4.4. Using the generic repository in the controller | 05:24 | |
| 32 | 4.5. Introduction to the specification pattern | 07:47 | |
| 33 | 4.6. Setting up the specification classes | 08:00 | |
| 34 | 4.7. Updating the repository to use the specification | 05:16 | |
| 35 | 4.8. Using the specification pattern | 08:51 | |
| 36 | 4.9. Adding sorting to the specification | 09:16 | |
| 37 | 4.10. Using the debugger | 12:30 | |
| 38 | 4.11. Adding projection to the spec part 1 | 08:40 | |
| 39 | 4.12. Adding projection to the spec part 2 | 05:39 | |
| 40 | 4.13. Adding projection to the spec part 3 | 09:24 | |
| 41 | 4.14. Summary | 02:26 | |
| 42 | 5.1. Introduction | 04:11 | |
| 43 | 5.2. Creating product spec parameters | 10:10 | |
| 44 | 5.3. Adding pagination part 1 | 04:19 | |
| 45 | 5.4. Adding pagination part 2 | 07:16 | |
| 46 | 5.5. Adding pagination part 3 | 06:41 | |
| 47 | 5.6. Creating a Base API controller | 05:46 | |
| 48 | 5.7. Adding the search functionality | 04:36 | |
| 49 | 5.8. Summary | 00:45 | |
| 50 | 6.1. Introduction | 05:47 | |
| 51 | 6.2. Adding a test controller for error handling | 06:14 | |
| 52 | 6.3. Exception handling middleware | 11:28 | |
| 53 | 6.4. Validation error responses | 07:59 | |
| 54 | 6.5. Adding CORS support on the API | 07:01 | |
| 55 | 6.6. Summary | 00:39 | |
| 56 | 7.1. Introduction | 06:30 | |
| 57 | 7.2. Creating the angular project | 10:25 | |
| 58 | 7.3. Reviewing the Angular project files | 08:42 | |
| 59 | 7.4. Using HTTPS with the Angular project | 07:11 | |
| 60 | 7.5. Adding Angular Material and Tailwind CSS | 09:53 | |
| 61 | 7.6. Adding VS Code extensions for Angular and Tailwind | 05:45 | |
| 62 | 7.7. Summary | 02:17 | |
| 63 | 8.1. Introduction | 02:31 | |
| 64 | 8.2. Setting up the folder structure and creating components | 10:35 | |
| 65 | 8.3. Adding a Header component | 10:19 | |
| 66 | 8.4. Improving the header component | 11:17 | |
| 67 | 8.5. Making http requests in Angular | 13:59 | |
| 68 | 8.6. Introduction to observables | 05:45 | |
| 69 | 8.7. Introduction to TypeScript | 05:39 | |
| 70 | 8.8. Typescript demo | 13:15 | |
| 71 | 8.9. Using Types in our Project | 06:41 | |
| 72 | 8.10. Summary | 03:10 | |
| 73 | 9.1. Introduction | 02:38 | |
| 74 | 9.2. Introduction to Angular services | 06:43 | |
| 75 | 9.3. Designing the shop page | 07:27 | |
| 76 | 9.4. Adding a product item component | 08:52 | |
| 77 | 9.5. Getting the types and brands lists | 04:35 | |
| 78 | 9.6. Adding the filtering functionality using Material Dialog | 07:23 | |
| 79 | 9.7. Adding the filtering functionality using Material Dialog part 2 | 10:05 | |
| 80 | 9.8. Hooking up the filters to the service | 10:19 | |
| 81 | 9.9. Adding the sorting functionality | 09:06 | |
| 82 | 9.10. Using a class to supply the parameters for the API request | 07:42 | |
| 83 | 9.11. Adding pagination to the client using Material | 09:46 | |
| 84 | 9.12. Adding the search functionality to the client | 11:56 | |
| 85 | 9.13. Summary | 01:47 | |
| 86 | 10.1. Introduction | 01:29 | |
| 87 | 10.2. Creating components and routes | 05:40 | |
| 88 | 10.3. Setting up the links in the app | 07:00 | |
| 89 | 10.4. Getting an individual product using Route params | 08:03 | |
| 90 | 10.5. Designing the product details page | 09:32 | |
| 91 | 10.6. Summary | 02:06 | |
| 92 | 11.1. Introduction | 01:36 | |
| 93 | 11.2. Creating a test error component | 09:34 | |
| 94 | 11.3. Creating a NotFound and Server Error component | 03:02 | |
| 95 | 11.4. Creating an HTTP Interceptor for handling API errors | 09:56 | |
| 96 | 11.5. Adding toast (snackbar) notifications | 07:31 | |
| 97 | 11.6. Handling validation errors from the API | 06:11 | |
| 98 | 11.7. Configuring the server error page | 10:04 | |
| 99 | 11.8. Configuring the Not found page | 04:54 | |
| 100 | 11.9. Adding an HTTP Interceptor for loading | 05:19 | |
| 101 | 11.10. Adding a progress bar to indicate loading | 02:31 | |
| 102 | 11.11. Making the header fixed to the top | 02:55 | |
| 103 | 11.12. Summary | 01:55 | |
| 104 | 12.1. Introduction | 07:22 | |
| 105 | 12.2. Creating a Redis instance to use in our app | 06:23 | |
| 106 | 12.3. Using Redis with .Net | 05:09 | |
| 107 | 12.4. Creating the Cart classes | 04:12 | |
| 108 | 12.5. Creating a Cart service | 08:20 | |
| 109 | 12.6. Creating the Cart controller | 05:14 | |
| 110 | 12.7. Testing the Cart in Postman | 06:15 | |
| 111 | 12.8. Summary | 00:58 | |
| 112 | 13.1. Introduction | 01:51 | |
| 113 | 13.2. Creating the cart components | 06:45 | |
| 114 | 13.3. Introduction to Angular Signals | 05:50 | |
| 115 | 13.4. Adding the Cart service methods | 07:24 | |
| 116 | 13.5. Adding an item to the cart | 09:59 | |
| 117 | 13.6. Using the add item functionality in the product item | 05:53 | |
| 118 | 13.7. Persisting the cart | 13:13 | |
| 119 | 13.8. Updating the nav bar with the cart item count | 04:40 | |
| 120 | 13.9. Styling the cart | 13:27 | |
| 121 | 13.10. Creating the order summary component | 06:38 | |
| 122 | 13.11. Creating the order summary component part 2 | 05:13 | |
| 123 | 13.12. Creating the order totals | 06:01 | |
| 124 | 13.13. Adding additional functions to the service | 05:25 | |
| 125 | 13.14. Adding these functions to the cart | 06:12 | |
| 126 | 13.15. Adding the update cart functionality to the product details | 11:11 | |
| 127 | 13.16. Creating the checkout components | 03:20 | |
| 128 | 13.17. Summary | 00:36 | |
| 129 | 14.1. Introduction | 07:21 | |
| 130 | 14.2. Setting up identity | 08:45 | |
| 131 | 14.3. Updating the DB and testing the endpoints | 06:35 | |
| 132 | 14.4. Adding a custom register endpoint | 09:49 | |
| 133 | 14.5. Testing the authentication | 05:16 | |
| 134 | 14.6. Creating additional user endpoints | 10:16 | |
| 135 | 14.7. Creating extension methods | 08:16 | |
| 136 | 14.8. Validation errors | 04:47 | |
| 137 | 14.9. Adding a user address class | 05:14 | |
| 138 | 14.10. Adding an endpoint to update the user address | 11:35 | |
| 139 | 14.11. Updating the user address part 2 | 04:45 | |
| 140 | 14.12. Summary | 01:33 | |
| 141 | 15.1. Introduction | 01:20 | |
| 142 | 15.2. Creating the account components | 07:23 | |
| 143 | 15.3. Introduction to Angular forms | 03:49 | |
| 144 | 15.4. Creating the login form | 10:45 | |
| 145 | 15.5. Updating the header component | 04:06 | |
| 146 | 15.6. Persisting the login | 05:02 | |
| 147 | 15.7. Adding an auth interceptor | 03:50 | |
| 148 | 15.8. Adding an Angular Material Menu | 05:13 | |
| 149 | 15.9. Adding the register form | 07:28 | |
| 150 | 15.10. Form validation part 1 | 03:37 | |
| 151 | 15.11. Form validation part 2 | 05:14 | |
| 152 | 15.12. Creating a re-usable text input | 11:05 | |
| 153 | 15.13. Creating an auth guard | 09:44 | |
| 154 | 15.14. Updating the auth guard to use observables | 07:40 | |
| 155 | 15.15. Challenge - empty cart guard | 01:53 | |
| 156 | 15.16. Challenge solution | 01:53 | |
| 157 | 15.17. Adding an empty state component | 07:03 | |
| 158 | 15.18. Summary | 02:27 | |
| 159 | 16.1. Introduction | 08:33 | |
| 160 | 16.2. Creating the delivery methods in the API | 06:52 | |
| 161 | 16.3. Setting up Stripe | 08:37 | |
| 162 | 16.4. Implementing the payment intent | 12:15 | |
| 163 | 16.5. Creating a payment controller | 10:49 | |
| 164 | 16.6. Checkout page layout | 07:56 | |
| 165 | 16.7. Adding client side Stripe | 15:31 | |
| 166 | 16.8. Creating the address element | 09:15 | |
| 167 | 16.9. Populating the address in the address form | 09:22 | |
| 168 | 16.10. Save the address as default address | 14:41 | |
| 169 | 16.11. Creating the delivery component part 1 | 06:31 | |
| 170 | 16.12. Creating the delivery component part 2 | 05:25 | |
| 171 | 16.13. Creating the delivery component part 3 | 09:47 | |
| 172 | 16.14. Creating the payment element | 10:49 | |
| 173 | 16.15. Creating the review component | 07:58 | |
| 174 | 16.16. Stripe address auto complete functionality | 05:30 | |
| 175 | 16.17. Validating step completion part 1 | 11:19 | |
| 176 | 16.18. Validating step completion part 2 | 05:17 | |
| 177 | 16.19. Creating a Stripe confirmation token | 08:15 | |
| 178 | 16.20. Updating the review component with the token information | 09:01 | |
| 179 | 16.21. Confirming the payment | 11:06 | |
| 180 | 16.22. Loading and error notifications | 08:50 | |
| 181 | 16.23. Checkout success page | 07:06 | |
| 182 | 16.24. Summary | 01:47 | |
| 183 | 17.1. Introduction | 02:02 | |
| 184 | 17.2. Creating the order aggregate part 1 | 07:31 | |
| 185 | 17.3. Creating the order aggregate part 2 | 04:08 | |
| 186 | 17.4. Configuring the order entities | 09:40 | |
| 187 | 17.5. Introducing the Unit of work | 05:28 | |
| 188 | 17.6. Implementing the unit of work | 08:29 | |
| 189 | 17.7. Using the unit of work | 06:34 | |
| 190 | 17.8. Creating the order controller | 11:07 | |
| 191 | 17.9. Debugging the order creation | 10:55 | |
| 192 | 17.10. Adding the get order methods | 07:11 | |
| 193 | 17.11. Updating the spec for eager loading | 07:25 | |
| 194 | 17.12. Updating the controller to eagerly load in the get methods | 06:08 | |
| 195 | 17.13. Shaping the data to return | 13:03 | |
| 196 | 17.14. Summary | 01:05 | |
| 197 | 18.1. Introduction | 04:20 | |
| 198 | 18.2. Creating the order components | 08:06 | |
| 199 | 18.3. Submitting the order | 13:09 | |
| 200 | 18.4. Designing the order component to display orders | 07:08 | |
| 201 | 18.5. Creating the order detailed page | 12:43 | |
| 202 | 18.6. Updating the address pipe with type guards | 10:24 | |
| 203 | 18.7. Adding a webhook endpoint in the payments controller | 14:06 | |
| 204 | 18.8. Testing the WebHook using the Stripe CLI | 09:40 | |
| 205 | 18.9. Adding SignalR to the API | 11:03 | |
| 206 | 18.10. Adding SignalR to the client | 11:48 | |
| 207 | 18.11. Updating the checkout success page | 11:11 | |
| 208 | 18.12. Adding a guard to the checkout success | 06:46 | |
| 209 | 18.13. Adding the home page component style | 05:42 | |
| 210 | 18.14. Summary | 01:32 | |
| 211 | 19.1. Introduction | 05:18 | |
| 212 | 19.2. Preparing the client app for publishing | 09:28 | |
| 213 | 19.3. Preparing the .Net app for publishing | 11:43 | |
| 214 | 19.4. Setting up a cloud Redis server | 06:42 | |
| 215 | 19.5. Setting up an azure account | 08:49 | |
| 216 | 19.6. Configuring the web app on Azure | 07:45 | |
| 217 | 19.7. Creating a Azure DB | 08:32 | |
| 218 | 19.8. Publishing the app to Azure | 07:22 | |
| 219 | 19.9. Adding Continuous integration | 14:19 | |
| 220 | 19.10. Troubleshooting Azure issues | 08:56 | |
| 221 | 19.11. Making the empty state component reusable | 11:38 | |
| 222 | 19.12. Updating CI to also build the angular app | 08:59 | |
| 223 | 19.13. Summary | 02:03 | |
| 224 | 20.1. Challenge - coupon challenge | 13:14 | |
| 225 | 21.1. Introduction | 01:22 | |
| 226 | 21.2. Adding roles to the app | 10:34 | |
| 227 | 21.3. Using the roles | 05:29 | |
| 228 | 21.4. Using the roles | 11:13 | |
| 229 | 21.5. Updating the Base controller CreatePagedResult method | 06:33 | |
| 230 | 21.6. Adding refund functionality | 08:07 | |
| 231 | 21.7. Creating the admin components | 05:39 | |
| 232 | 21.8. Creating an angular directive | 08:15 | |
| 233 | 21.9. Creating an admin route guard | 03:55 | |
| 234 | 21.10. Adding the admin service methods | 05:29 | |
| 235 | 21.11. Adding the admin component code | 07:37 | |
| 236 | 21.12. Designing the admin component template | 08:30 | |
| 237 | 21.13. Populating the orders table | 12:09 | |
| 238 | 21.14. Adding the order table action button functionality | 08:14 | |
| 239 | 21.15. Adding a confirmation prompt | 08:53 | |
| 240 | 21.16. Summary | 01:32 | |
| 241 | 22.1. Introduction | 04:24 | |
| 242 | 22.2. Setting up caching on the API | 08:42 | |
| 243 | 22.3. Creating an attribute | 10:40 | |
| 244 | 22.4. Testing the caching | 05:28 | |
| 245 | 22.5. Invalidating the cache | 09:48 | |
| 246 | 22.6. Lazy loading in angular | 11:00 | |
| 247 | 22.7. End of course summary | 06:04 | |
| 248 | 23.1. Updating the .Net project to .Net 9 | 07:36 | |
| 249 | 23.2. Updating the Angular project to Angular 20 | 18:08 | |
| 250 | 23.3. Updating to Tailwind 4 and Angular Material 20 | 20:00 |
Unlock unlimited learning
Get instant access to all 249 lessons in this course, plus thousands of other premium courses. One subscription, unlimited knowledge.
Learn more about subscriptionComments
0 commentsWant to join the conversation?
Sign in to commentSimilar courses
Learn to build professional-grade Angular Applications | Angular Start
Angular Basics (v15)
Building Your First App with Spring Boot and Angular