c# - 如何在 UNO 平台应用程序中使用 Microsoft.Extensions.DependencyInjection
问题描述
我是UNO 平台的新手,我正在尝试使用这个框架开发我的第一个应用程序。我也想使用 DI 工具包,所以我选择Microsoft.Extensions.DependencyInjection
了应该与这个平台兼容的工具包。
顺便说一句,我无法理解如何将依赖项注入到我的 ViewModel 中。我把这篇文章加红了: 如何在 .NET Core 控制台应用程序中使用 Microsoft.Extensions.DependencyInjection?这是我的方法:
应用程序.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;
}
我想用 DI 处理的类的接口和实现在IMessageBroker
哪里?MessageBroker
然后在我的 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<IMessageBroker>()
?
任何提示将不胜感激。
解决方案
您可以做的一种方法是拥有一个静态类 ServiceLocator,它仅从一开始就初始化。这个类暴露了一个只读的ServiceProvider,你可以调用它来获取你注册的东西。
您可能会在其他地方阅读,或者这里的其他人可能会评论 this is anti-pattern
,这通常是断章取义的。根据您要执行的操作以及解决方案的结构,此服务定位器模式可能完全没问题。
这是一个示例项目,您可以参考 https://github.com/weitzhandler/UnoRx/tree/f2a0771e6a513863108e58ac7087078f39f7e3ed
另一种方法是编写一个视图模型定位器,它会通过您的视图自动解析所有依赖项。但是,这可能会也可能不会过度杀伤您的用例。
最后,我个人的喜好,有一个依赖于自动发现和自动解析的 shell 项目;每个发现的较小项目将在内部依赖于服务定位器或功能组合
推荐阅读
- python - 查找二进制向量的“阶段”(“完成”的百分比,或块中的相对位置)的大多数 Pythonic 方法
- php - 如何从准备好的国家名称、数据库列表中搜索文本文件,然后用 id 替换这些国家?
- python - 错误:ResultSet 对象没有属性“endswith”
- javascript - 用 () 反应渲染返回语句与什么都不返回
- angular - 如何从 API 正确使用 ng2 图表和 Angular 显示数据
- javascript - 将 Javascript Promise 放入函数中
- arrays - String incrementer codewars (Ruby) 问题
- c++ - 通过网络传递 std::variant 是否安全,跨平台
- c - 警告:取消引用 'void *' 指针 [默认启用] 和错误:没有忽略 void 值,因为它应该是帮助 c
- python - 1:1 替换已弃用的 time.clock()