-
Notifications
You must be signed in to change notification settings - Fork 0
JA 04_framework_strategies
🇺🇸 English | 🇯🇵 日本語 | Introduction
DependencyPropertyGenerator は、単一の [DependencyProperty] 属性から、ターゲットとする UI フレームワーク(WPF、UWP、WinUI、Uno、Avalonia、MAUI)に最適化されたボイラープレートコードを動的に生成する。
本文書は、特定のフレームワーク固有のバグを修正したり新機能を追加したりする際に、API マッピングを規定するための正とすべき公式定義として機能する。プラットフォーム間のすべてのアーキテクチャ上の差異は、Sources/Strategies/ ディレクトリに配置された IFrameworkGeneratorStrategy 実装クラス群によって完全に抽象化されている。
本ジェネレーターの最大の価値は、「1つの [DependencyProperty] 属性を書くだけで、あらゆる XAML UI フレームワーク向けのネイティブコードを自動生成できる」ことにあります。このクロスプラットフォーム性は、データ抽出(解析)とコード出力(生成)を完全に分離するアーキテクチャによって実現されています。
flowchart TD
subgraph Input ["1. ユーザーコード"]
Code["[DependencyProperty<bool>('IsActive')]"]
end
subgraph Core ["2. 共通 Model (純粋な DTO)"]
DTO["DependencyPropertyData<br>・Name: 'IsActive'<br>・Type: 'bool'<br>・OnChanged: 'OnIsActiveChanged'"]
end
subgraph Strategies ["3. Framework Strategies (生成器)"]
WPF["WpfFrameworkGenerator ➡ WPF用コード"]
AVA["AvaloniaFrameworkGenerator ➡ Avalonia用コード"]
MAUI["MauiFrameworkGenerator ➡ MAUI用コード"]
WINUI["UwpFrameworkGenerator ➡ WinUI/Uno用コード"]
end
Input --> DTO
DTO --> WPF
DTO --> AVA
DTO --> MAUI
DTO --> WINUI
-
抽出 (Model): Roslyn パイプラインは属性を解析し、フレームワークに依存しない純粋な値型 DTO(例:
DependencyPropertyData)に変換します。 -
出力 (Strategy):
IFrameworkGeneratorStrategyクラス群は共通 DTO を受け取り、ターゲットプラットフォーム固有のボイラープレートを合成します。
WPF はプロパティシステムの基盤として System.Windows.DependencyProperty と DependencyPropertyKey を使用する。
-
登録:
DependencyProperty.RegisterまたはRegisterAttachedを呼び出す。 -
読み取り専用:
RegisterReadOnlyおよびRegisterAttachedReadOnlyを使用する。 -
メタデータ:
System.Windows.FrameworkPropertyMetadataまたはPropertyMetadataを介して管理される。 -
コールバック:
PropertyChangedCallback、CoerceValueCallback、ValidateValueCallbackといった専用のデリゲート型を使用して結線される。
Note
WPF のメタデータ(FrameworkPropertyMetadata)は、レイアウト制御やデータバインディング向けの非常に豊富なフラグ(AffectsMeasure や BindsTwoWayByDefault など)を内包している。ジェネレーターはこれらの WPF 固有のフラグを安全に出力するため、FrameworkMetadataData のフィールドを最優先で活用する。
Avalonia は Avalonia.AvaloniaProperty に基づいて構築され、通常は StyledProperty<T>、AttachedProperty<T>、または DirectProperty<T> としてプロパティを定義する。
-
登録:
AvaloniaProperty.RegisterまたはRegisterAttachedを呼び出す。 -
Direct Properties:
IsDirectフラグが有効な場合、ジェネレーターはフィールドベースの高速なプロパティアクセス用に専用のジェネリックメソッドRegisterDirectを出力する。 - メタデータ: 登録メソッドの引数として直接渡されるか、Avalonia 固有のメタデータ機能を使用して管理される。
-
コールバック: Observable や
AvaloniaPropertyChangedなどのイベントベースのサブスクリプションモデルを介してルーティングされる。
MAUI は、従来の DependencyProperty ではなく Microsoft.Maui.Controls.BindableProperty および BindablePropertyKey を利用した独自の型システムを採用している。
-
登録:
BindableProperty.CreateまたはCreateAttachedを介して実行される。 -
読み取り専用:
CreateReadOnlyまたはCreateAttachedReadOnlyを利用する。 - メタデータ: 専用のクラスにカプセル化されるのではなく、API の引数としてフラットに渡される。
-
コールバック: 特定のデリゲート(
BindingPropertyChangedDelegate、CoerceValueDelegate、ValidateValueDelegate)にマッピングされる。
UWP と Uno は Windows.UI.Xaml.DependencyProperty に依存するが、WinUI 3 は Microsoft.UI.Xaml.DependencyProperty を使用する。
-
登録:
DependencyProperty.RegisterおよびRegisterAttachedに厳密に制限される。 -
メタデータ:
PropertyMetadataを使用して処理される。 -
コールバック:
PropertyChangedCallbackのみをネイティブに提供する。
Warning
これらのプラットフォームは、強制補正 (Coerce) や検証 (Validate) 用のネイティブ API を備えていない。ジェネレーターは、プロパティの getter/setter や PropertyChanged イベント自体の内部で手動で値をクランプまたは補正する、専用のフォールバック実装を出力して振る舞いを模倣しなければならない。
新しい UI フレームワークのサポートを追加する場合、または破壊的な API の変更(Avalonia v12 など)に対処する場合は、以下のアーキテクチャ原則に厳密に従わなければならない。
Important
1. DTO の保護
共有 DTO モデル(DependencyPropertyData など)を決して変異させてはならない。プラットフォーム固有のすべての違いは、Sources/Strategies/ の下にある対応するジェネレータークラス(XxxFrameworkGenerator.cs など)のメソッドをオーバーライドすることによって、積極的に隔離および吸収されなければならない。
Tip
2. シグネチャの差異を吸収するためのメソッド抽出
メソッド抽出を活用して API シグネチャの差異を解決する。例えば、GenerateRegisterMethodArguments メソッドを使用して Register メソッドに渡される引数の正確な文字列を構築し、さまざまな引数構成に柔軟に対応する。
Note
3. ゼロアロケーション生成規則
文字列生成パス(SourceWriter)内での LINQ や不要な string.Join の禁止など、厳格なパフォーマンス最適化ルールについては、05. コード生成とパフォーマンス最適化 (Ⅳ. パフォーマンス最適化ルール) を参照のこと。
Roslyn パイプラインの初期化中、ジェネレーターは以下の厳格な優先カスケードを利用してターゲット UI フレームワークを自動的に解決する。
-
高精度なシンボル検査 (
Compilation.TryRecognizeFramework) コンパイルコンテキスト内に存在するコアフレームワークの型シンボルを検査する。-
Microsoft.Maui.Controls.BindableObject$\rightarrow$ Framework.Maui -
Avalonia.AvaloniaObject$\rightarrow$ Framework.Avalonia -
Uno.UI.FeatureConfiguration$\rightarrow$ Framework.Uno/Framework.UnoWinUi -
Microsoft.UI.Xaml.DependencyObject$\rightarrow$ Framework.WinUi -
Windows.UI.Xaml.DependencyObject$\rightarrow$ Framework.Uwp -
System.Windows.DependencyObject$\rightarrow$ Framework.Wpf
-
-
MSBuild プロパティ / コンパイル定数のフォールバック (
AnalyzerConfigOptionsProvider) シンボルを解決できない場合は、プロジェクトファイル内のDefineConstants(HAS_WPF、HAS_WINUI、HAS_UWP、HAS_UNO、HAS_UNO_WINUI、HAS_AVALONIA、HAS_MAUI)またはUseMauiプロパティを検査する。 -
未認識フレームワークのフォールバック (
Framework.None) どのフレームワークも一致しない場合、ジェネレーターは安全にFramework.Noneを割り当てる。この状態では、プラットフォーム固有のusingインポートと登録を選択的にスキップしながら、診断DPG0000(Framework is not recognized)を発行する。コンパイルの失敗を完全に防ぐために、生の属性定義のみを安全に出力する。 (※DPG0000の発生原因とプロジェクト設定での解決手順については 08. 診断エラーコード一覧 (DPG0000) を参照)
This wiki is automatically synchronized from spec/ in the repository.
- Introduction
- 01. FAQ & Design Rationale
- 02. Foundation & Domain
- 03. Pipeline Architecture
- 04. Framework Strategies
- 05. Synthesis & Performance
- 06. Complexity Model
- 07. Test Specification
- 08. Diagnostics Reference
- 概要
- 01. 設計思想とFAQ
- 02. 基盤とドメイン
- 03. パイプライン構造
- 04. フレームワーク別生成仕様
- 05. コード生成と最適化
- 06. 計算量モデル
- 07. テスト仕様書
- 08. 診断機能リファレンス