【问题标题】:uwp with c# and mvvm how to do inversion of control (dependency injection)uwp 与 c# 和 mvvm 如何做控制反转(依赖注入)
【发布时间】: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 中进行编码。原则

【问题讨论】:

    标签: c# .net-core mvvm uwp inversion-of-control


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 2011-03-14
      • 2011-02-08
      相关资源
      最近更新 更多