skills/christian289/dotnet-with-claudecode/structuring-avalonia-projects

structuring-avalonia-projects

SKILL.md

6.2 AvaloniaUI Solution and Project Structure

6.2.1 Project Naming Conventions

SolutionName/
├── SolutionName.Abstractions      // .NET Class Library (Interface, abstract class, and other abstract types)
├── SolutionName.Core              // .NET Class Library (Business logic, pure C#)
├── SolutionName.Core.Tests        // xUnit Test Project
├── SolutionName.ViewModels        // .NET Class Library (MVVM ViewModel)
├── SolutionName.AvaloniaServices  // Avalonia Class Library (Avalonia-related services)
├── SolutionName.AvaloniaLib       // Avalonia Class Library (Reusable components)
├── SolutionName.AvaloniaApp       // Avalonia Application Project (Entry point)
├── SolutionName.UI                // Avalonia Custom Control Library (Custom controls)
└── [Solution Folders]
    ├── SolutionName/              // Main project group
    └── Common/                    // Common project group

Naming by Project Type:

  • .Abstractions: .NET Class Library - Defines abstract types like Interface, abstract class (Inversion of Control)
  • .Core: .NET Class Library - Business logic, data models, services (UI framework independent)
  • .Core.Tests: xUnit/NUnit/MSTest Test Project
  • .ViewModels: .NET Class Library - MVVM ViewModel (UI framework independent)
  • .AvaloniaServices: Avalonia Class Library - Avalonia-related services (DialogService, NavigationService, etc.)
  • .AvaloniaLib: Avalonia Class Library - Reusable UserControl, Window, Converter, Behavior, AttachedProperty
  • .AvaloniaApp: Avalonia Application Project - Entry point, App.axaml
  • .UI: Avalonia Custom Control Library - ControlTheme-based custom controls

Project Dependency Hierarchy:

SolutionName.AvaloniaApp
    ↓ references
SolutionName.Abstractions (Top layer - does not depend on other projects)
    ↓ references
SolutionName.Core

Role of the Abstractions Layer:

  • Houses all Interfaces and abstract classes
  • Dependency inversion through abstract types instead of direct references to concrete types (Dependency Inversion Principle)
  • Actual implementations injected via DI container at runtime
  • Can be replaced with Mock objects during testing
Weekly Installs
5
GitHub Stars
16
First Seen
Jan 25, 2026
Installed on
codex5
opencode4
gemini-cli4
antigravity3
codebuddy3
windsurf3