如何在 UNO 平台应用程序中使用 Microsoft.Extensions.DependencyInjection

Posted

技术标签:

【中文标题】如何在 UNO 平台应用程序中使用 Microsoft.Extensions.DependencyInjection【英文标题】:How can I use Microsoft.Extensions.DependencyInjection in an UNO Platform app 【发布时间】:2020-10-28 08:10:30 【问题描述】:

我是UNO Platform 的新手,我正在尝试使用这个框架开发我的第一个应用程序。我也想使用 DI 工具包,所以我选择了应该与这个平台兼容的Microsoft.Extensions.DependencyInjection

顺便说一句,我无法理解如何将依赖项注入到我的 ViewModel 中。 我把这个帖子红了: How can I use Microsoft.Extensions.DependencyInjection in an .NET Core console app? 这是我的做法:

App.xaml.cs

    public App()
    
        ConfigureFilters(global::Uno.Extensions.LogExtensionPoint.AmbientLoggerFactory);

        var services = new ServiceCollection()
            .AddSingleton<IMessageBroker, MessageBroker>();
        var serviceProvider = services.BuildServiceProvider();

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

IMessageBrokerMessageBroker 是我想用 DI 处理的类的接口和实现。 然后在我的 ViewModel 上做:

MainPageViewModel.cs

public MainPageViewModel(IMessageBroker broker)

     // some code

到目前为止,一切都很好。

对于 MVVM 工具包,我选择了MVVM helpers。 如果我理解正确的话,这个 MVVM 工具包没有提供任何将 View 附加到 ViewModel 的约定,所以我应该手动完成:

MainPage.xaml.cs

public sealed partial class MainPage : Page

    public MainPage()
    
        this.InitializeComponent();

        // How can I get a reference to ServiceProvider for calling GetService
        var broker = serviceProvider.GetService<IMessageBroker>()

        this.DataContext = new MainPageViewModel(broker);
    

我如何在此处获得对ServiceProvider 的引用以调用GetService&lt;IMessageBroker&gt;()

任何提示将不胜感激。

【问题讨论】:

【参考方案1】:

您可以做的一种方法是拥有一个静态类 ServiceLocator,它只从一开始就被初始化。这个类暴露了一个只读的ServiceProvider,你可以调用它来获取你注册的东西。

您可以在其他地方阅读,或者这里的其他人可能会评论这是anti-pattern,这通常是断章取义的。根据您要执行的操作以及解决方案的结构,这种服务定位器模式可能完全没问题。

这是一个示例项目,您可以参考 https://github.com/weitzhandler/UnoRx/tree/f2a0771e6a513863108e58ac7087078f39f7e3ed

另一种方法是编写一个视图模型定位器,它会通过您的视图自动解析所有依赖项。但是,这可能会也可能不会过度杀伤您的用例。

最后,我个人的喜好,有一个依赖于自动发现和自动解析的 shell 项目;每个发现的较小项目将在内部依赖于服务定位器或功能组合

【讨论】:

以上是关于如何在 UNO 平台应用程序中使用 Microsoft.Extensions.DependencyInjection的主要内容,如果未能解决你的问题,请参考以下文章

如何将第三方库添加到 UNO 平台 WebAssembly 项目

Uno 平台 一 WinUI终极跨平台方案

在 Uno 平台上合并音频和视频

是否可以在 Uno 项目中使用 Xamarin Forms 控件?

是否可以在支持所有平台的 Uno 平台上使用 Blend for Visual Studio?

MAUI 和 Uno 平台有啥区别?