Architecture: How to break circular dependency between platform-preview (n...
Documentation for Sessions
🏗️ Architecture: How to break circular dependency between platform-preview (n...
Date: 2026-03-11
Time: 23:37:23 UTC
Session: gspace1-205.5
Agent: angular
Confidence: 95%
Status: ✅ Documented
📋 Decision Context
Question:
How to break circular dependency between platform-preview (new library) and vitto-studio when both need to share preview state?
Task: Not specified
🎯 Decision Made
Chosen:
PreviewContentService — a thin signal-holder service in platform-preview that PreviewService (vitto-studio) pushes data into, and PreviewFrameComponent (platform-preview) reads from. No imports from vitto-studio in platform-preview.
Options Considered:
- Direct injection of PreviewService from vitto-studio into platform-preview components — creates circular dep
- Injection token in a shared foundational lib — over-engineered for 3 signals
- PreviewContentService in platform-preview — thin bridge, no circular dep
- ViewChild parent-to-child communication — fragile, breaks with dock panel wrapping
💭 Reasoning
vitto-studio imports PlatformPreviewPanelComponent from platform-preview (for dock registration). platform-preview's PreviewFrameComponent needs preview HTML from PreviewService (in vitto-studio). Direct import creates circular: platform-preview→vitto-studio→platform-preview. The PreviewContentService pattern breaks this by providing a thin providedIn:'root' service in platform-preview that holds signals (staticHtml, devServerUrl, previewMode, previewError). PreviewService pushes data in. PreviewFrameComponent reads it. Zero circular imports. This is the same pattern used by Angular CDK's overlay service.
📁 Files Involved
libs/libs-structural/platform-preview/src/lib/services/preview-content.service.tslibs/libs-structural/vitto-studio/src/lib/services/preview.service.tslibs/libs-structural/platform-preview/src/lib/components/preview-frame/preview-frame.component.ts
🔗 Related
- Decision ID:
dev_1773272243252_4pxz0u4 - Session: 205
- Workspace: gspace1
Auto-generated by MCP Smart Consolidation