依赖关系注入 WPF MVVM 导航 .NET Core



我需要一些帮助来了解如何实例化视图模型,而无需将它们全部作为 MainViewModel 类构造函数中的参数。

你们中的任何人可以帮助我了解并摆脱构造函数中的这么多参数。我已经阅读了有关FactoryPatterns的信息,但我不明白如何实现它,或者这不是解决方案?无论如何,这是代码。

谢谢。请帮助我,这让我发疯了!

应用.xaml.cs

private readonly ServiceProvider _serviceProvider;
public App()
{
ServiceCollection services = new ServiceCollection();
ConfigureServices(services);
_serviceProvider = services.BuildServiceProvider();
}
private void ConfigureServices(ServiceCollection services)
{
services.AddSingleton<MainWindow>();
// Services
services.AddSingleton<ICustomerService, CustomerService>();
// ViewModels
services.AddScoped<MainViewModel>();
services.AddScoped<CustomerViewModel>();
services.AddScoped<CustomerAddViewModel>();
services.AddScoped<CustomerEditViewModel>();
services.AddScoped<ServiceViewModel>();
}
private void OnStartup(object sender, StartupEventArgs e)
{
var mainWindow = _serviceProvider.GetService<MainWindow>();
mainWindow.DataContext = _serviceProvider.GetService<MainViewModel>();
mainWindow.Show();
}

主视图模式.cs

public class MainViewModel : ViewModelBase
{
private CustomerViewModel _customerViewModel;
private CustomerAddViewModel _customerAddViewModel;
private CustomerEditViewModel _customerEditViewModel;
private ViewModelBase _selectedViewModel;
public ViewModelBase SelectedViewModel
{
get => _selectedViewModel;
set
{
_selectedViewModel = value;
NotifyPropertyChanged();
}
}
public RelayCommand CustCommand { get; set; }
public RelayCommand ServCommand { get; set; }
**public MainViewModel(
CustomerViewModel customerViewModel,
CustomerAddViewModel customerAddViewModel,
CustomerEditViewModel customerEditViewModel)
{
_customerViewModel = customerViewModel;
_customerAddViewModel = customerAddViewModel;
_customerEditViewModel = customerEditViewModel;
CustCommand = new RelayCommand(OpenCustomer);
}**
private void OpenCustomer()
{
SelectedViewModel = _customerViewModel;
}
}

客户视图模型

public class CustomerViewModel : ViewModelBase
{
private ICustomerService _repo;
private ObservableCollection<Customer> _customers;
public ObservableCollection<Customer> Customers
{
get => _customers;
set
{
_customers = value;
NotifyPropertyChanged();
}
}
public CustomerViewModel(ICustomerService repo)
{
_repo = repo;
}
public async void LoadCustomers()
{
List<Customer> customers = await _repo.GetCustomers();
Customers = new ObservableCollection<Customer>(customers);
}

}

您正在使用构造函数注入,这只是执行 DI 的方法之一。另一种方法是属性注入,您通常会执行以下操作:

public class ClassToBeInjected
{
[Inject]
public SomeDataType PropertyToBeInjected {get; set;}
... etc ...
}

只要 ClassToBeInjected 是通过 DI 框架创建的,任何标记为[Inject]的属性也将自动注入。此外,使用[Inject]属性标记的 SomeDataType 的任何属性也将注入,依此类推。

如何实现此目的的确切机制将取决于您的 DI 框架。我在这里使用了[Inject]属性,这是 Ninject 使用的,但每个框架都有自己的方式。

您不需要将所有依赖项传递给 MainViewModel,现在这很容易,因为您只有三个,如果他们是 20 个呢? 我认为这里最好的办法是注入依赖容器并从那里获取所有视图模型。

public class MainViewModel : ViewModelBase
{
private ServiceProvider _serviceProvider;
public MainViewModel(IServiceProvider provider)
{
_serviceProvider = provider;
}
private void SomeMethod()
{
CustomerViewModel viewModel = _serviceProvider.GetRequiredService<CustomerViewModel>();
}
}

最新更新