[ PROMPT_NODE_23724 ]
composition
[ SKILL_DOCUMENTATION ]
# 组合与映射
确保你的 ViewModel 被正确实例化并映射到相应的 View,对于构建可维护的应用程序至关重要。
## ViewModel 到 View 的映射
Zafiro 使用 `DataTypeViewLocator` 根据数据类型自动将 ViewModel 映射到 View。
### 在 App.axaml 中集成
在应用程序的数据模板中注册 `DataTypeViewLocator`:
xml
### 注册
映射可以全局或局部注册。Zafiro 项目中的常见做法是使用命名约定或通过源代码生成器进行显式注册。
## 组合根 (Composition Root)
使用中央 `CompositionRoot` 来管理依赖注入和服务注册。
csharp
public static class CompositionRoot
{
public static IShellViewModel CreateMainViewModel(Control topLevelView)
{
var services = new ServiceCollection();
services
.AddViewModels()
.AddUIServices(topLevelView);
var serviceProvider = services.BuildServiceProvider();
return serviceProvider.GetRequiredService();
}
}
### 注册 ViewModel
使用适当的生命周期(Transient、Scoped 或 Singleton)注册 ViewModel。
csharp
public static IServiceCollection AddViewModels(this IServiceCollection services)
{
return services
.AddTransient()
.AddSingleton();
}
## 视图注入
使用 `Connect` 辅助方法(如果可用)或在 `OnFrameworkInitializationCompleted` 中手动实例化:
csharp
public override void OnFrameworkInitializationCompleted()
{
this.Connect(
() => new ShellView(),
view => CompositionRoot.CreateMainViewModel(view),
() => new MainWindow());
base.OnFrameworkInitializationCompleted();
}
> [!TIP]
> 当你需要手动实例化类,同时仍需从 `IServiceProvider` 解析其依赖项时,请使用 `ActivatorUtilities.CreateInstance`。