This is my first project with .NET creating a web service (ASP.NET) as a simple CRUD.
The project follows a hexagonal architecture using Domain Driven Development (DDD), then the projects are divided in:
- Domain - the layer responsible for all business rules and business models and should always be framework independent.
- Infrastructure - the layer for projects that implement framework specific code and do database communications.
- Application - the layer for the projects like WebApis, workers, etc.
We also have tests focused on BDD (Behaviour Driven Development) with SpecFlow and Unit Tests.
INFO: This repository is an increment from a project provided by Crescer.
- Install Visual Studio IDE or CLI to build and run the WebAPI.
- Install SpecFlow's plugin for Visual Studio and any other requirements from its getting started.
- The database (DB) is a MongoDB and it's hosted freely, but feel free to run on your own local DB by changing the keys.
Once running the service access:
- Swagger on: http://localhost:53651/swagger/
- Make calls to: http://localhost:53651/api/ OR
- Swagger on: http://localhost:5000/swagger/
- Make calls to: http://localhost:5000/api/
Example:
http://localhost:5000/api/musicas
will return all songs stored.
The following are the improvement goals from the base project.
- Add MongoDB to store all data
- MusicaRepository
- AlbumRepository
- Enhance RESTful API to follow REST principles (eg: when creating an entity we should return 201 instead of the simple 200)
- Read Mongo connection string from configuration instead of hardcoded
- Add SpecFlow BDD tests and some examples
- Add Unit Tests mocking not only controllers but the entire server
- Add Serilog for logging events in a structured way
- Add Dockerfile for automated builds - Build once run everywhere
- Return DTOs instead of entity classes on Controller responses
- Improve API performance using structs as DTO ValueObjects instead of classes
- Add Notification pattern using MessageResult classes to return messages instead of exceptions when business rules fail.
Eg:
public class BaseResult<T> { public bool Valid { get => !Messages.Any(); } public List<string> Messages { get; set; } public Exception Error { get; set; } public T Data { get; set; } }