C# 注入具有界面特性的界面&;设计原则
我有一系列的类,每个类根据它们的角色有几个依赖项。这些依赖项正在注入构造函数中。例如:C# 注入具有界面特性的界面&;设计原则,c#,mvvm,C#,Mvvm,我有一系列的类,每个类根据它们的角色有几个依赖项。这些依赖项正在注入构造函数中。例如: public class UserViewModel { //... public UserViewModel(IDataService dataService, INotificationService notificationService, IDialogService dialogSe
public class UserViewModel
{
//...
public UserViewModel(IDataService dataService,
INotificationService notificationService,
IDialogService dialogService,
INavigationService navigationService)
{
this.DataService = dataService;
this.NotificationService = notificationService;
this.DialogService = dialogService;
this.NavigationService = navigationService;
}
}
如您所见,有几个参数需要设置。我可以编写如下界面:
public interface IInteractionService
{
public INotificationService NotificationService { get; set; }
public IDialogService DialogService { get; set; }
public INavigationService { get; set; }
}
并将注入的InteractionService实现完整地传递给UserViewModel的构造函数:
public UserViewModel(IDataService dataService,
IInteractionService interactionService) {}
然后像这样使用它:
this.InteractionService.NotificationService.Publish(message);
在设计模式/原则方面,使用包含接口属性的交互接口是否存在任何问题?还是有更好的方法来看待它
感谢您的建议……一般来说,您不应该创建包含不同服务的“上帝”服务。它打破了单响应原理(SRP)
但我不明白DI如何针对服务实例注入null?也许您应该针对创建“上帝”服务来纠正这种行为?在我看来,构造函数中的依赖注入是一种地狱之路。在应用程序的生命周期中,您能否预测依赖项的最终数量?你真的想每次都修改ctor的代码吗?您真的想一次初始化所有依赖项而不是延迟初始化吗 例如,MEF可以惰性地注入私有字段
您绝对不应该测试空的注入值。如果您的DI框架本身没有进行这些测试,那么就扔掉它,使用普通的测试。没有意识到检查空值是不必要的,谢谢。因此,您认为让它保持在第一个代码段中的状态—单独注入每个服务?是的。如果这三个服务是独立的,不要将它们耦合在一起。私有字段注入更难测试,并且不像构造函数注入那样可读。