uwp 与 c# 和 mvvm 如何做控制反转(依赖注入)

Posted

技术标签:

【中文标题】uwp 与 c# 和 mvvm 如何做控制反转(依赖注入)【英文标题】:uwp with c# and mvvm how to do inversion of control (dependency injection) 【发布时间】:2021-04-22 22:40:29 【问题描述】:

所以我的大部分编程都是在 java 中完成的,我使用了大量的 IoC 和 DPI,通过从 main 方法向新创建对象的构造函数注入所有必要的依赖项。 所以我将所有存储库注入服务,然后将服务注入控制器。这样,我只创建了每个依赖项的一个实例,并将它们注入到需要它们的地方。

在java中我这样做:

public class Main 

    public static void main(String[] args) 

        InterfaceRepository<Booking> bookingInterface = new BookingRepository();
        InterfaceRepository<User> userInterface = new UserRepository();
        
        InterfaceBookingService interfaceBookingService = new BookingService(bookingInterface, userInterface);
        InterfaceUserService interfaceUserService = new UserService(userInterface);
        
        BookingController bookingController = new BookingController(interfaceBookingService, interfaceUserService);
        UserController userController = new UserController(interfaceUserService)

    


在 uwp 中,我完全不知道如何像在 java 中那样做。视图模型的实例化方式和位置以及如何将存储库注入视图模型;如果几个视图模型需要我的一些存储库,我可以将存储库的相同实例注入不同的视图模型吗?我希望能够测试我的视图模型,所以我也希望能够灵活地处理我注入的内容。

对不起,我没有任何代码,这是因为我什至无法在不了解如何进行 IoC 并遵循 S.O.L.I.D. 的情况下开始使用 c# 和 mvvm 在 uwp 中进行编码。原则

【问题讨论】:

【参考方案1】:

关于 UWP 中的 MVVM,可以参考document。文档中有示例,您可以查看视图模型的实例。

您可以使用 Microsoft.Extensions.DependencyInjection NuGet 包进行依赖注入。

请检查以下步骤: 1.在 C# UWP 项目中创建 MVVM 架构。 2.点击菜单中的工具,选择选项NuGet Package Manager > Manage NuGet Package for Solution... > Browse,在搜索框中输入Microsoft.Extensions.DependencyInjection,为您的安装包项目。 3.创建Container 对象,该对象维护可以在应用程序中的任何位置解析的所有依赖项。

//App.xaml.cs
public App()

    this.InitializeComponent();
    this.Suspending += OnSuspending;
    Container = ConfigureDependencyInjection();

public IServiceProvider Container  get; 

IServiceProvider ConfigureDependencyInjection()

    var serviceCollection = new ServiceCollection();

    serviceCollection.AddTransient<IMessageService, MessageService>();

    return serviceCollection.BuildServiceProvider();

4.创建MessageService类和IMessageService接口。

//Add a new class to create the interface and class
public interface IMessageService

    string GetMessage();

public class MessageService : IMessageService

    public string GetMessage()
    
        return "Hello from Message Service & Dependency Injection";
    

5.注册MessageServiceContainer(参考步骤3中的代码)。 6.将MessageService注入到你的viewmodel类中,比如MainViewModel类。

public class MainViewModel

    protected IMessageService MessageService  get; 
    public string Message  get => MessageService.GetMessage(); 
    public MainViewModel(IMessageService messageService)
    
        MessageService = messageService;
        ……
    
    ……

7.解析MainViewModel,通过ActivatorUtilities函数向构造函数注入参数注入依赖。

//MainPage.xaml.cs
public MainPage()

    this.InitializeComponent();
    var container = ((App)App.Current).Container;
    DataContext = ActivatorUtilities.GetServiceOrCreateInstance(container, typeof(MainViewModel));

8.在页面中显示消息。

//MainPage.xaml
<Grid>
    <TextBlock Text="Binding Message" Margin="10" FontSize="20"/>
</Grid>

【讨论】:

以上是关于uwp 与 c# 和 mvvm 如何做控制反转(依赖注入)的主要内容,如果未能解决你的问题,请参考以下文章

C#依赖注入控制反转IOC实现详解

win10 uwp MVVM入门

uwp - MVVM - 初学完全无基础第一次尝试1

c#依赖注入和控制反转的书籍

如何禁用 Xbox One 的指针模式(C#、UWP)

在 mvvm 中为 uwp 分享 inkCanvas 问题