如何在 UNO 平台应用程序中使用 Microsoft.Extensions.DependencyInjection
How can I use Microsoft.Extensions.DependencyInjection in an UNO Platform app
我是 UNO Platform 的新手,我正在尝试使用此框架开发我的第一个应用程序。我也想使用 DI 工具包,所以我选择了应该与该平台兼容的 Microsoft.Extensions.DependencyInjection
。
顺便说一句,我无法理解如何将依赖项注入我的 ViewModel。
我红色 post:
这是我的方法:
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;
}
其中 IMessageBroker
和 MessageBroker
是我的 class 我想用 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<IMessageBroker>()
?
如有任何提示,我们将不胜感激。
您可以做的一种方法是使用静态 class ServiceLocator,它仅从一开始就初始化。这个class暴露了一个只读的ServiceProvider,你可以调用它来获取你注册的东西。
您可能会在其他地方阅读,或者这里的其他人可能会评论这是 anti-pattern
,这通常是断章取意的。根据您尝试执行的操作以及您的解决方案的结构,此服务定位器模式可能完全没问题。
这里有一个示例项目,您可以参考
https://github.com/weitzhandler/UnoRx/tree/f2a0771e6a513863108e58ac7087078f39f7e3ed
另一种方法是编写一个视图模型定位器,它会通过您的视图自动解析所有依赖项。但是,这可能会也可能不会过度使用您的用例。
最后,我的个人风格,有一个 shell 项目依赖于自动发现和自动解析;每个发现的较小项目都将在内部依赖于服务定位器或功能组合
我是 UNO Platform 的新手,我正在尝试使用此框架开发我的第一个应用程序。我也想使用 DI 工具包,所以我选择了应该与该平台兼容的 Microsoft.Extensions.DependencyInjection
。
顺便说一句,我无法理解如何将依赖项注入我的 ViewModel。
我红色 post:
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;
}
其中 IMessageBroker
和 MessageBroker
是我的 class 我想用 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<IMessageBroker>()
?
如有任何提示,我们将不胜感激。
您可以做的一种方法是使用静态 class ServiceLocator,它仅从一开始就初始化。这个class暴露了一个只读的ServiceProvider,你可以调用它来获取你注册的东西。
您可能会在其他地方阅读,或者这里的其他人可能会评论这是 anti-pattern
,这通常是断章取意的。根据您尝试执行的操作以及您的解决方案的结构,此服务定位器模式可能完全没问题。
这里有一个示例项目,您可以参考 https://github.com/weitzhandler/UnoRx/tree/f2a0771e6a513863108e58ac7087078f39f7e3ed
另一种方法是编写一个视图模型定位器,它会通过您的视图自动解析所有依赖项。但是,这可能会也可能不会过度使用您的用例。
最后,我的个人风格,有一个 shell 项目依赖于自动发现和自动解析;每个发现的较小项目都将在内部依赖于服务定位器或功能组合