# devskill/aspnetb7-at4 architecture

> Architecture diagram of the GitHub repository devskill/aspnetb7-at4, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/devskill/aspnetb7-at4
- Repository: https://github.com/devskill/aspnetb7-at4

## Overview

1. **Top-level shape**
   - This repository is a **.NET/C# solution** (`AdmissionTest4.sln`) organized as a set of **four independent task projects** plus a separate **Tests** subtree.
   - The README is minimal, so the structure itself is the main architectural signal: this is a **multi-project exercise repo**, not a single unified application.

2. **Solution boundary**
   - `AdmissionTest4/Task1` through `AdmissionTest4/Task4` each look like a **small standalone console-style project** with its own `Program.cs` and `.csproj`.
   - There is **no shared application/library project** in the tree, which suggests the tasks are intentionally isolated rather than layered into a common domain/service architecture.

3. **Task 1: word counting**
   - `Task1` contains `WordCounter.cs` plus `Program.cs`.
   - The likely flow is: input text is handled by the entrypoint, passed to `WordCounter`, and results are produced back to the console or caller.
   - This task is a small **single-responsibility utility app** centered on text analysis.

4. **Task 2: domain objects + data operations**
   - `Task2` includes `Customer.cs`, `Purchase.cs`, `DataOperation.cs`, and `Program.cs`.
   - The presence of two entity-like classes (`Customer`, `Purchase`) plus a dedicated operation class suggests a **small domain model** with a separate processing layer.
   - `DataOperation` is the main boundary for business logic: it likely coordinates customers and purchases, computes derived results, or performs CRUD-style manipulation in memory.

5. **Task 2 architectural pattern**
   - Compared with Task 1, Task 2 is more structured: it separates **data representation** from **operations**.
   - That makes it the closest thing in the repo to a layered design: `Program` as orchestration, model classes as data, `DataOperation` as processing logic.

6. **Task 3: file-based processing**
   - `Task3` contains `FileUtility.cs`, `Data.txt`, and `Program.cs`.
   - This task clearly introduces a **filesystem boundary**: the app reads or processes the bundled text file rather than only in-memory inputs.
   - `FileUtility` is the abstraction around file I/O, while `Data.txt` is test/sample input packaged with the project.

7. **Task 3 data flow**
   - The likely flow is: `Program` invokes `FileUtility`, which accesses `Data.txt`, then returns content for further processing or display.
   - This is the only task with an explicit external artifact in the tree, so for an architecture diagram it should be shown as the **file-system integration point**.

8. **Task 4: format validation**
   - `Task4` contains `FormatChecker.cs` and `Program.cs`.
   - This suggests a focused utility for **string/format validation or normalization**, with the checker class encapsulating the core rules.
   - As with the other tasks, `Program` acts as the thin orchestration layer.

9. **Tests subsystem**
   - The `Tests` folder contains separate test projects for **Task1, Task2, and Task4**.
   - The structure implies each task is tested independently, reinforcing the repo’s **vertical-slice / per-task** organization.
   - There is no test project for Task3, which may indicate either manual verification or an exercise that was not unit-tested.

10. **Dependency pattern**
   - The repo appears to follow a simple pattern everywhere: **`Program.cs` → task-specific helper/class → output**.
   - Most logic is concentrated in a single class per task, which keeps dependencies shallow and makes each project easy to diagram as a small self-contained module.

11. **Operational and tooling context**
   - The repo is built around **.csproj** projects and a Visual Studio/.NET solution file, so the key runtime is the **.NET runtime**.
   - There are no signs of web hosting, databases, message brokers, or cloud infrastructure; the architecture is primarily **local computation + console I/O + file I/O**.

12. **How to draw it**
   - A good architecture diagram would show:
     - one **solution container**
     - four **independent task projects**
     - a **tests boundary** connected to Task1, Task2, and Task4
     - a **filesystem artifact** (`Data.txt`) connected only to Task3
   - Avoid depicting cross-task dependencies; the tree suggests the tasks are intentionally isolated.

Main entry points: [`AdmissionTest4/AdmissionTest4.sln`](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/AdmissionTest4.sln) (Solution), [`AdmissionTest4/Task2/DataOperation.cs`](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task2/DataOperation.cs) (Data Ops), [`AdmissionTest4/Task1/Task1.csproj`](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task1/Task1.csproj) (Task1), [`AdmissionTest4/Task1/Program.cs`](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task1/Program.cs) (Main)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_main["Solution & tasks"]
  node_solution["Solution<br/>sln<br/>[AdmissionTest4.sln]"]
  node_task1proj["Task1<br/>csproj<br/>[Task1.csproj]"]
  node_task1program["Main<br/>entrypoint<br/>[Program.cs]"]
  node_wordcounter["Word Counter<br/>[WordCounter.cs]"]
  node_task2proj["Task2<br/>csproj<br/>[Task2.csproj]"]
  node_task2program["Main<br/>entrypoint<br/>[Program.cs]"]
  node_dataoperation["Data Ops<br/>[DataOperation.cs]"]
  node_customer["Customer<br/>model<br/>[Customer.cs]"]
  node_purchase["Purchase<br/>model<br/>[Purchase.cs]"]
  node_task3proj["Task3<br/>csproj<br/>[Task3.csproj]"]
  node_task3program["Main<br/>entrypoint<br/>[Program.cs]"]
  node_fileutility["File Utility<br/>io helper<br/>[FileUtility.cs]"]
  node_datafile["Data.txt<br/>sample data<br/>[Data.txt]"]
  node_task4proj["Task4<br/>csproj<br/>[Task4.csproj]"]
  node_task4program["Main<br/>entrypoint<br/>[Program.cs]"]
  node_formatchecker["Format Checker<br/>validator<br/>[FormatChecker.cs]"]
end

subgraph group_tests["Test projects"]
  node_task1testproj["Task1 Tests<br/>test csproj<br/>[Task1Test.csproj]"]
  node_task2testproj["Task2 Tests<br/>test csproj<br/>[Task2Test.csproj]"]
  node_task4testproj["Task4 Tests<br/>test csproj<br/>[Task4Test.csproj]"]
end

node_solution --> node_task1proj
node_solution --> node_task2proj
node_solution --> node_task3proj
node_solution --> node_task4proj
node_solution --> node_task1testproj
node_solution --> node_task2testproj
node_solution --> node_task4testproj
node_task1proj --> node_task1program
node_task1program --> node_wordcounter
node_task2proj --> node_task2program
node_task2program --> node_dataoperation
node_dataoperation --> node_customer
node_dataoperation --> node_purchase
node_task3proj --> node_task3program
node_task3program --> node_fileutility
node_fileutility --> node_datafile
node_task4proj --> node_task4program
node_task4program --> node_formatchecker

click node_solution "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/AdmissionTest4.sln"
click node_task1proj "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task1/Task1.csproj"
click node_task1program "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task1/Program.cs"
click node_wordcounter "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task1/WordCounter.cs"
click node_task2proj "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task2/Task2.csproj"
click node_task2program "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task2/Program.cs"
click node_dataoperation "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task2/DataOperation.cs"
click node_customer "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task2/Customer.cs"
click node_purchase "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task2/Purchase.cs"
click node_task3proj "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task3/Task3.csproj"
click node_task3program "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task3/Program.cs"
click node_fileutility "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task3/FileUtility.cs"
click node_datafile "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task3/Data.txt"
click node_task4proj "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task4/Task4.csproj"
click node_task4program "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task4/Program.cs"
click node_formatchecker "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task4/FormatChecker.cs"
click node_task1testproj "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Tests/Task1Test/Task1Test.csproj"
click node_task2testproj "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Tests/Task2Test/Task2Test.csproj"
click node_task4testproj "https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Tests/Task4Test/Task4Test.csproj"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_solution,node_task1proj,node_task1program,node_wordcounter,node_task2proj,node_task2program,node_dataoperation,node_customer,node_purchase,node_task3proj,node_task3program,node_fileutility,node_datafile,node_task4proj,node_task4program,node_formatchecker toneBlue
class node_task1testproj,node_task2testproj,node_task4testproj toneAmber
```

## Components

### Solution & tasks

Independent .NET task projects under one solution

- [Solution](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/AdmissionTest4.sln): sln · Top-level .NET solution · `AdmissionTest4/AdmissionTest4.sln`
- [Task1](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task1/Task1.csproj): csproj · Word counting console project · `AdmissionTest4/Task1/Task1.csproj`
- [Main](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task1/Program.cs): entrypoint · Task1 orchestration · `AdmissionTest4/Task1/Program.cs`
- [Word Counter](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task1/WordCounter.cs): utility · Counts words in text · `AdmissionTest4/Task1/WordCounter.cs`
- [Task2](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task2/Task2.csproj): csproj · Customer/purchase processing project · `AdmissionTest4/Task2/Task2.csproj`
- [Main](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task2/Program.cs): entrypoint · Task2 orchestration · `AdmissionTest4/Task2/Program.cs`
- [Data Ops](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task2/DataOperation.cs): service · Coordinates customer and purchase logic · `AdmissionTest4/Task2/DataOperation.cs`
- [Customer](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task2/Customer.cs): model · Customer entity · `AdmissionTest4/Task2/Customer.cs`
- [Purchase](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task2/Purchase.cs): model · Purchase entity · `AdmissionTest4/Task2/Purchase.cs`
- [Task3](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task3/Task3.csproj): csproj · File-based processing project · `AdmissionTest4/Task3/Task3.csproj`
- [Main](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task3/Program.cs): entrypoint · Task3 orchestration · `AdmissionTest4/Task3/Program.cs`
- [File Utility](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task3/FileUtility.cs): io helper · Reads bundled file input · `AdmissionTest4/Task3/FileUtility.cs`
- [Data.txt](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task3/Data.txt): sample data · Bundled file input · `AdmissionTest4/Task3/Data.txt`
- [Task4](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task4/Task4.csproj): csproj · Format checking project · `AdmissionTest4/Task4/Task4.csproj`
- [Main](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task4/Program.cs): entrypoint · Task4 orchestration · `AdmissionTest4/Task4/Program.cs`
- [Format Checker](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Task4/FormatChecker.cs): validator · Checks string/format rules · `AdmissionTest4/Task4/FormatChecker.cs`

### Test projects

Per-task unit test projects

- [Task1 Tests](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Tests/Task1Test/Task1Test.csproj): test csproj · Unit tests for Task1 · `AdmissionTest4/Tests/Task1Test/Task1Test.csproj`
- [Task2 Tests](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Tests/Task2Test/Task2Test.csproj): test csproj · Unit tests for Task2 · `AdmissionTest4/Tests/Task2Test/Task2Test.csproj`
- [Task4 Tests](https://github.com/devskill/aspnetb7-at4/blob/main/AdmissionTest4/Tests/Task4Test/Task4Test.csproj): test csproj · Unit tests for Task4 · `AdmissionTest4/Tests/Task4Test/Task4Test.csproj`

## Connections

- Solution → Task1
- Solution → Task2
- Solution → Task3
- Solution → Task4
- Solution → Task1 Tests
- Solution → Task2 Tests
- Solution → Task4 Tests
- Task1 → Main
- Main → Word Counter
- Task2 → Main
- Main → Data Ops
- Data Ops → Customer
- Data Ops → Purchase
- Task3 → Main
- Main → File Utility
- File Utility → Data.txt
- Task4 → Main
- Main → Format Checker
