MOO WebTech
Finaldefenseadvanced

L18 — Final Project Defense

Each student presents and defends their final C# + .NET MAUI + PostgreSQL project one-on-one with the instructor. Rubric-based grading and verification questions.

80 min05.06.2026L18

Assignment Reference

Students defend the final course project: a cross-platform .NET MAUI desktop/mobile application that uses MVVM and connects to a PostgreSQL database for full CRUD.

Scope (minimum):

  • At least two domain tables in PostgreSQL, with one foreign-key relationship between them
  • A main screen that lists records and a detail/form screen for create + edit
  • Working Create, Read, Update, Delete for at least one of the two tables
  • Input validation on the form (non-empty, number ranges, date ranges as appropriate)
  • MVVM: all data logic in ViewModels, no SQL in code-behind
  • A Repository class (or equivalent) wrapping Npgsql — the ViewModel must not reference Npgsql types
  • Runs on at least Windows Machine; Android target is a bonus

Domain examples (student picks one, or proposes their own):

  • Library (books + authors)
  • School (students + courses)
  • Fitness tracker (workouts + exercises)
  • Personal finance (accounts + transactions)
  • Recipe box (recipes + ingredients)

Grading Rubric

#CriterionMax pointsNotes
1Project builds and runs on Windows without errors10Clean build, no missing NuGet packages, no crash on launch
2Database schema — two tables, foreign key, sensible types10Inspected via \d in psql or pgAdmin. Nulls, types, PK/FK correct.
3Read — list screen shows data from the database10Rows come from PostgreSQL, not hard-coded.
4Create — form adds a new row; it appears in the list and in the DB15Verified by re-reading the list and querying the table.
5Update — editing an existing row persists10Change survives app restart.
6Delete — removing a row persists10Change survives app restart.
7Input validation — invalid input is rejected gracefully10Empty name, out-of-range numbers, bad date → clear error message, no crash.
8MVVM discipline — no SQL/Npgsql in code-behind; ViewModel has no UI types10Code inspection of at least one ViewModel + one page code-behind.
9Parameterised queries — no string concatenation into SQL5Code inspection of the repository.
10Code quality — naming, file layout, using on connections, no dead code5General impression on walk-through.
11Oral defense — answers verification questions correctly5See question list below.
Total100

Grade bands:

  • 90–100 → A
  • 75–89 → B
  • 60–74 → C
  • < 60 → retake

Verification Questions

The instructor will pick 3–4 questions from this list during the defense. A confident answer earns full points for criterion 11; a partial answer earns partial points.

  1. Architecture. Walk me through what happens when the user taps "Add" — from button press to row in PostgreSQL.
  2. MVVM. Why is the SQL in a repository class and not in the ViewModel or the page's code-behind? What would break if we moved it?
  3. Data binding. Point at a {Binding SomeProperty} in your XAML. What object does it actually bind to, and how does the page know?
  4. Change notification. If a property in your ViewModel changes but the UI doesn't update, what's almost certainly missing? Show me where you implemented it.
  5. Connections. Show me where you open an NpgsqlConnection. How is it closed? What would happen if it weren't?
  6. Parameters. Show me a query that takes user input. Why did you use a @parameter instead of string concatenation? Demonstrate how the safe version blocks SQL injection.
  7. Foreign keys. Which of your two tables has the foreign key? What happens in your app if the referenced row is deleted?
  8. Validation. I'm the user. I type -500 into the age field and press Add. Walk me through what happens in your code.
  9. Error handling. I shut down PostgreSQL while your app is running, then press "Refresh". What does your app do? What should it do?
  10. Reload vs. in-memory update. After adding a row, do you re-fetch from the database or just append to the ObservableCollection? What are the trade-offs?
  11. Async. Are your database calls synchronous or asynchronous? If synchronous — what would a user feel on a slow connection? If asynchronous — show me an await.
  12. Navigation. How does the user move between your two screens? Walk me through the Shell route registration.

Note to instructor: pick questions that target the parts of the student's actual code. If they built a library app, ask about the authors→books FK (Q7). If their update is in-memory only, ask Q10. Don't use a generic set — use the student's own project as the context.

Submission Checklist

Before your defense slot starts, make sure the following are ready:

  • Project compiles cleanly with no warnings about missing packages
  • PostgreSQL is running and accepts your connection string
  • Your students / domain tables contain at least 3 seed rows so the list has something to show
  • The app runs on Windows Machine (ideally in release configuration — faster startup)
  • You can open the project in Visual Studio and navigate to any file the instructor asks for in under 10 seconds
  • You can open psql (or pgAdmin) and run SELECT * FROM your_table alongside the app to show rows updating
  • You have a connection string that works on the classroom machine (if different from home, update it before class)
  • Optional but recommended: a one-page README with the domain description, the schema, and a screenshot

On the day of the defense:

  1. Arrive 5 minutes before your slot
  2. Have the project already open and the database already started
  3. Bring your laptop fully charged — the defense bench has 1 outlet
  4. Close Discord, Telegram, and anything else before sharing your screen
  5. Be ready to demo Add → Update → Delete in under 2 minutes; the instructor will ask for it

Good luck! The hard work is behind you — this is your chance to show it off.