TaskoMask is an open-source task management system built on the .Net framework. The primary objective of this project is to demonstrate the practical application of advanced software development concepts such as DDD (Domain-Driven Design), TDD (Test-Driven Development), BDD (Behavior-Driven Development), and Microservices.
In many cases, the experience of applying these concepts to real-world software products is often obscured by proprietary software companies. TaskoMask seeks to provide transparency and insight into their usage.
We invite you to explore our project's wiki for more information
Try it [online]
All the information presented beyond this section represents our project's final objectives and the broader vision. It's important to note that some of these elements may still be a work in progress. To gain insight into our project's roadmap and track our progress, please refer to the following items:
Here is a comprehensive list of the patterns, principles, approaches, and methodologies that we have incorporated into our project's design. It's important to note that these have been included as examples to showcase their usage within a project. In a real-world design, you would need to carefully evaluate and select the most appropriate ones based on your project's specific trade-offs and requirements.
-
click for details
- Strangler application pattern
- Decompose by subdomain
- Database per service
- Saga
- API Composition
- Docker
- Docker-Compose
- Kubernetes
- Messaging : MassTransit (RabbitMQ)
- Remote Procedure Call : Grpc.AspNetCore
- Idempotent Consumer
- API Gateway : Ocelot
- Backend for front-end
- Service discovery : Kubernetes - Consul
- Circuit Breaker : Polly
- Log aggregation : Serilog - Seq
- Application metrics : prometheus-net
- Distributed tracing : Opentelemetry-dotnet - Jaeger
- Health check API : AspNetCore.HealthChecks
- IDP : DuendeSoftware IdentityServer
-
click for details
- Unit Testing
- Integration Testing
- API Testing
- UI Testing
- Acceptance Testing
- Mutation Testing (check dashboard reporter)
- Screenplay Pattern
- Well written Acceptance Tests organized in :
- Object Mother Pattern
- Test Data Builder
- Test Hooks
- Test Doubles
- Dummy
- Stub
- Mock
- Teardown
- Fixture Management
- Verification
- Living Documentation
-
click for details
- Rich Domain Model
- Aggregate
- Entity
- Value Object
- Domain Event
- Domain Service
- Always Valid Domain Model
- Invariants
- Specification
- Factory Method
- Optimistic Concurrency
- Separate Domain Model and Data Model
-
click for details
- Separated Read and Write Model
- Separated Read and Write DB
Here is a comprehensive list of the tools and technologies we have employed to implement this project.
-
click for details
- .Net 6
- C#
- ASP.NET Web API
- ASP.NET MVC
- ASP.NET Identity
- MongoDB
- Redis
- Entity Framework
- SQL
- Ocelot : .NET core API Gateway
- DuendeSoftware IdentityServer : OpenID Connect and OAuth 2.x framework for ASP.NET Core
- MassTransit : a framework on top of message transports such as RabbitMQ
- xUnit : testing framework
- FluenAssertion : write fluent assertions
- NSubstitute : to make test double (Mock, stub, fake, spy)
- Gherkin : use native language to describe test cases
- SpecFlow : turns Gherkin scenarios into automated tests
- Suzianna : writing acceptance tests, using Screenplay Pattern
- Selenium : supporting browser automation
- MediatR : simple mediator implementation
- Grpc.AspNetCore : gRPC library for ASP.NET Core
- AutoMapper : an object-object mapper
- FluentValidation : building strongly-typed validation rules
- Swagger : expose Swagger JSON endpoints from APIs
- Serilog : provides diagnostic logging
- AspNetCore.HealthChecks : ASP.NET Core Health Check
- prometheus-net : .NET library to instrument your code with Prometheus metrics
- MvcPagedList.Core : easily paging in ASP.NET Core MVC
- EasyCaching : caching library
- stryker-net: Mutation testing for .NET
- nuke: Build System for C#/.NET
-
click for details
- Blazor
- Blazor Server
- Cookie Authentication without ASP.NET Identity
- It was Blazor Server befor refactoring it to WebAssembly (browse the codes here)
- Blazor WebAssembly (standalone)
- JWT Authentication
- Comunication between components
- Local Storage
- Consume REST API
- Retry using HttpClientRetryHelper
- Handle Drag and Drop
- Using Modal, Toast, etc.
- Blazor Server
- .HTML
- CSS
- JavaScript
- JQuery
- Bootstrap
- Jquery.noty
- Chart.js
- Blazor
-
click for details
- Continuous Integration
- Feature Branch Workflow
- Conventional Commits
- GitHub Actions
- Mutation testing dashboard reporter
- Caching Behavior using Pipeline Pattern
- Validation Behavior using Pipeline Pattern (Check both Fluent Validation and Data Annotation Validation)
- Event Storing Behavior using Pipeline Pattern
- Exception Handling
- Cookie Authentication
- JWT Authentication
- Role Permission Base User Management without ASP.NET Identity (check Domain documentation)
- Swagger UI with JWT Support
We welcome contributions, issue reports, and questions from the community. Any contributions you make are highly valued and appreciated.
Please refer to our Contribution Guide for detailed instructions on how to get involved in this project.
This project thrives and evolves thanks to the dedicated individuals who contribute their time and expertise
- Read my articles on Medium
- Follow the hashtag #taskomask on Twitter
We are dedicated to creating a valuable resource for the .NET community. If this project has been beneficial to you, please consider showing your support by giving it a ⭐ star. Your support is crucial, whether through starring the project, contributing, or sharing it with anyone who can benefit. You can also join the conversation on Twitter by using the hashtag #taskomask.
This project is authored by Hamed Shirbandi and is licensed under the MIT License. You can find Hamed across various online platforms, and please don't hesitate to reach out if you have any questions or inquiries.
2023
-
- Instrument with Prometheus metrics
- Implement build system using nuke
- Implement Mutation Testing using Stryker
- Integrate CI with nuke and stryker
- Mutation testing dashboard reporter
-
- Global Code Refactoring
- Handle Managed and Unmanaged Exceptions
- Log Managed and Unmanaged Exceptions
-
- Simplify Write Service Architecture
- Implement Unit Tests for Task Services
- Implement Integration Tests for Task Services
-
- Extract Task Write Service
- Extract Task Read Service
- Remove Monolith Service
- Simplify Write Service Architecture
2022
-
- Extract Board Write Service
- Extract Board Read Service
- Implement Integration Tests for Board Services
- Implement Unit Tests for Board Services
- Handle RPC requests by gRPC
- Extract API Gateway Aggregator
- Complete API Gateway Configs by Ocelot
-
- Implement Unit Tests for Owner Services
- Implement Integration Tests for Owner Services
-
- Extract Owner Write Service
- Extract Owner Read Service
- Handle Messaging by RabbitMQ
-
- Extract Identity Service
- Add IdentityServer as IDP
- Add ASP.NET Identity
- Add User Panel API Gateway
- Refactor to Clean Architecture
- Follow Vertical Slice Architecture
- Follow Use Case Driven Development
-
- Migrate from Monolith to Microservices
-
- Convert UserPanel from Blazor Server to Blazor WebAssembly
- Complete the functionalities for single user usage
-
- Implement Unit Tests
- Implement Integration Tests
- Implement Acceptance Tests
- Implement API Tests
- Implement UI Tests
-
- Full refactor Domain model with DDD concepts
- Separate Domain Model and Data Model
- Separate Read Side and Write Side Database
2021
-
- Upgrade to .NET 6
-
- Convert user panel from ASP.NET MVC to Blazor Server
-
- Implement admin panel with ASP.NET MVC
- Implement administration subdomain
-
- Remove Asp.net Identity
- Add cookie authentication
- Add JWT authorization
- Implement API with ASP.NET Web API
-
- Full refactore