gpt4 book ai didi

c# - 在基类中拥有所有依赖项是一种好习惯吗?

转载 作者:行者123 更新时间:2023-12-03 10:52:23 25 4
gpt4 key购买 nike

我有一个使用 MVVM 模式的 WPF 应用程序。我使用 Autofac 作为 DI 容器。像我的其他应用程序一样,我有一个 ViewModelBase 类,它实现了 INotifyPropertyChanged 接口(interface),还解析了在容器中注册的依赖项:

public class ViewModelBase : ObservableObject
{
protected IErrorHandler _errorHandler;
protected IEventAggregator _eventAggregator;
protected ICustomDialogService _customDialogService;
protected IUserSettingsRepository _userSettingsRepository;
protected IReferralRepository _referralRepository;
protected Notification _notification;
protected IPrinting _printingService;
protected ILookupRepository _lookupRepository;
protected IWorklistRepository _worklistRepository;
protected IDialogCoordinator _dialogCoordinator;

public ViewModelBase()
{
_errorHandler = AppContainer.Resolve<IErrorHandler>();
_eventAggregator = AppContainer.Resolve<IEventAggregator>();
_customDialogService = AppContainer.Resolve<ICustomDialogService>();
_userSettingsRepository = AppContainer.Resolve<IUserSettingsRepository>();
_referralRepository = AppContainer.Resolve<IReferralRepository>();
_notification = AppContainer.Resolve<Notification>();
_printingService = AppContainer.Resolve<IPrinting>();
_lookupRepository = AppContainer.Resolve<ILookupRepository>();
_worklistRepository = AppContainer.Resolve<IWorklistRepository>();
_dialogCoordinator = AppContainer.Resolve<IDialogCoordinator>();
}
}

该应用程序有大约 20 个 View 模型,它们都需要使用不同的依赖项——有时不需要。即使永远不会使用它们,每个 View 模型都可以访问这些依赖项是一种好习惯吗?

最佳答案

您通常通过类构造函数或类似方式提供依赖项,而不是从构造函数内部。因此,实际上您的任何类(class)都不应该知道您的 DI 容器的任何内容。相反,容器解析调用上下文中的依赖关系并将它们提供给类构造函数。我 t 是调用者解决依赖关系的责任,而不是您的类(class)的责任。这就是控制反转原理的重点。

话虽如此,您的依赖项应该像这样解决:

var errorHandler = AppContainer.Resolve<IErrorHandler>();
var eventAggregator = AppContainer.Resolve<IEventAggregator>();
var myModel = new MyModel(errorHandler, eventAggregator);

这边 myModel仅获取正常工作实际需要的那些依赖项。

要创建另一个模型:
var customDialogService = AppContainer.Resolve<ICustomDialogService>();
var userSettingsRepository = AppContainer.Resolve<IUserSettingsRepository>();
var myModel = new MyModel2(customDialogService, userSettingsRepository);

关于c# - 在基类中拥有所有依赖项是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51985052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com