WPF依赖注入
时间: 2025-06-02 15:02:57 浏览: 13
### WPF中依赖注入的实现方法与示例
在WPF应用程序中,依赖注入(Dependency Injection, DI)是一种用于管理对象创建和依赖关系的技术。通过依赖注入,可以提高代码的可维护性和可测试性。以下是基于提供的引用内容[^1]和[^2],结合实际应用场景的详细说明。
#### 1. 使用内置ServiceProvider实现依赖注入
WPF可以通过.NET Core或.NET Framework中的`IServiceProvider`接口来实现依赖注入。以下是一个完整的示例:
```csharp
public partial class App : Application
{
private IServiceProvider _serviceProvider;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
_serviceProvider = serviceCollection.BuildServiceProvider();
var mainWindow = _serviceProvider.GetRequiredService<MainWindow>();
mainWindow.Show();
}
private void ConfigureServices(IServiceCollection services)
{
// 注册服务
services.AddSingleton<IDataAccess, DataAccess>();
services.AddTransient<MainWindowViewModel>();
services.AddTransient<MainWindow>();
}
}
```
在此示例中,`IServiceCollection`用于注册服务和视图模型,而`IServiceProvider`则负责解析这些服务。每个视图模型和服务都可以通过构造函数注入其依赖项[^1]。
#### 2. 使用AutoMapper进行映射支持
如果需要在WPF应用中使用AutoMapper进行对象映射,可以结合依赖注入框架完成配置。以下是一个示例:
```csharp
public class AutoMapperProfile : Profile
{
public AutoMapperProfile()
{
CreateMap<UserDto, User>();
}
}
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// 注册AutoMapper
builder.Register(context => new MapperConfiguration(cfg =>
cfg.AddProfile(new AutoMapperProfile())))
.SingleInstance();
builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve))
.As<IMapper>()
.InstancePerLifetimeScope();
// 注册ViewModel
builder.RegisterType<MainViewModel>().AsSelf().InstancePerDependency();
builder.RegisterType<UserViewModel>().AsSelf().InstancePerDependency();
}
}
```
此代码片段展示了如何将AutoMapper与Autofac集成,并为视图模型注册依赖项[^2]。
#### 3. 工厂模式注册视图模型
在某些情况下,可能需要动态创建视图模型。此时可以使用工厂模式来注册视图模型。以下是一个示例:
```csharp
public class ViewModelFactory
{
private readonly IServiceProvider _serviceProvider;
public ViewModelFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public T Create<T>() where T : class
{
return _serviceProvider.GetService<T>();
}
}
// 在App.xaml.cs中注册
services.AddTransient<ViewModelFactory>();
services.AddTransient<MainViewModel>(provider =>
{
var userService = provider.GetRequiredService<IUserService>();
var mapperService = provider.GetRequiredService<IMapper>();
return new MainViewModel(userService, mapperService);
});
```
通过这种方式,可以在运行时灵活地创建视图模型实例。
#### 4. 使用ServiceLocator模式(不推荐)
尽管ServiceLocator模式可以简化依赖注入的实现,但它通常被认为是一种反模式,因为它隐藏了依赖关系。以下是一个简单的示例:
```csharp
public class ServiceLocator
{
private IServiceProvider _serviceProvider;
public ServiceLocator()
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IDataAccess, DataAccess>();
serviceCollection.AddSingleton<MainWindowViewModel>();
_serviceProvider = serviceCollection.BuildServiceProvider();
}
public MainWindowViewModel GetMainWindowViewModel()
{
return _serviceProvider.GetService<MainWindowViewModel>();
}
}
```
尽管这种方法简单易用,但建议尽量避免,因为它的依赖关系不够明确[^1]。
---
###
阅读全文
相关推荐

















