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框架本身没有进行这些测试,那么就扔掉它,使用普通的测试。

没有意识到检查空值是不必要的,谢谢。因此,您认为让它保持在第一个代码段中的状态—单独注入每个服务?是的。如果这三个服务是独立的,不要将它们耦合在一起。私有字段注入更难测试,并且不像构造函数注入那样可读。