This is a desktop application developed in C# (.NET 9.0) for managing tasks within a small team. The project highlights the practical application of:
🏗️ Layered Architecture 🧩 Design Patterns 📐 SOLID Principles
👉 Version 2 introduces a modern graphical user interface and integration with a real SMTP server for notifications.
An interactive form for:
- Adding tasks (title, description, type, priority, deadline)
- Viewing tasks in a clean and organized
DataGridView
When a task is marked as "Done", the application automatically sends an email using:
- MailKit
- SMTP (Gmail)
Automatic dependency management with:
Microsoft.Extensions.DependencyInjection
The application uses a layered architecture:
[TaskManager.UI] → Presentation (WinForms + IoC)
│
▼
[TaskManager.Core] → Business Logic + Interfaces (no external dependencies)
▲
│
[TaskManager.Data] → Data Access (SQLite)
📌 Note: Core is the application's center – it defines the rules, while UI and Data merely implement them.
-
Single Responsibility Principle (SRP)
- Validation is separated into
TaskValidator. TaskServiceonly orchestrates the logic.
- Validation is separated into
-
Open/Closed Principle (OCP)
- The notification system uses
ITaskNotifier. - ✔ Email notifications were added without modifying
TaskService.
- The notification system uses
-
Liskov Substitution Principle (LSP)
- Hierarchy:
TaskItem→DeadlineTask/RecurringTask. Implementations can be swapped without affecting the application. - ✔
SqliteTaskRepositoryandInMemoryTaskRepositoryare interchangeable.
- Hierarchy:
-
Interface Segregation Principle (ISP)
- Interfaces are segregated:
ITaskReaderandITaskWriter. - ✔
ReportServiceonly uses read operations, preventing accidental modifications.
- Interfaces are segregated:
-
Dependency Inversion Principle (DIP)
TaskServicedepends on abstractions:ITaskRepositoryandITaskNotifier.- ✔ All dependencies are injected via the constructor using the IoC Container.
- 🗄️ Storage: SQLite (local
tasks.dbfile) - 🧱 Pattern: Repository Pattern
- 🔧 Technology: ADO.NET (
Microsoft.Data.Sqlite) - ❌ No ORM is used (as per requirements).
✔ Manual mapping from SqliteDataReader to C# objects is performed.
The project includes unit tests that cover:
- ✔ Data validation
- ✔ Service logic
- ✔ Liskov Substitution Principle (LSP)
- ✔ Checks for ISP & DIP through reflection
⚡ The tests are:
- Fast
- Isolated
- Based on
InMemoryTaskRepository
👉 Run the tests:
dotnet test- .NET 9.0 SDK
In src/TaskManager.Core/Notifications/EmailNotifier.cs, you must add:
- Your Gmail address
- A Google-generated App Password
dotnet run --project src/TaskManager.UI