如何解决如何将参数发送到我通过以下方式获得引用的 ViewModel:Startup.ServiceProvider.GetRequiredService?
谁能给我一些建议。我正在使用
Microsoft.Extensions.DependencyInjection 5.0.1 nuget 包
并且我想获得对需要向其注入服务的 viewmodel 类的引用,同时将参数传递给 viewmodel。这里我有一个例子,其中
我的类调用一个 viewmodel,它也需要向它传递一个参数。有人能告诉我怎么做吗?
public class ThemeManagementPage : headingView
{
private readonly ThemeManagementviewmodel _vm;
public ThemeManagementPage(int param1)
{
// This page is called with a parameter and then
// whhat I need to do is to pass the parameter `param1`
// to the viewmodel which I have identified
// as a Transient (see bottom of post)
BindingContext = _vm =
Startup.ServiceProvider.GetrequiredService<ThemeManagementviewmodel>();
}
}
public partial class ThemeManagementviewmodel : Baseviewmodel
{
private readonly IResourceService _resourceService;
public ThemeManagementviewmodel(IResourceService resourceService,int param1)
{
_resourceService = resourceService;
var x = param1
}
}
这里是我的 DI 设置供参考:
public partial class ResourceService : IResourceService
{
private IDatabaseService _databaseService;
public ResourceService(IDatabaseService databaseService)
{
_databaseService = databaseService;
}
}
public interface IResourceService
{
void SetResourceColors();
}
public static class Startup
{
public static IServiceProvider ServiceProvider { get; set; }
public static IServiceProvider Init()
{
var serviceProvider = new ServiceCollection().ConfigureServices()
.BuildServiceProvider();
ServiceProvider = serviceProvider;
return serviceProvider;
}
}
public static class DependencyInjectionContainer
{
public static IServiceCollection ConfigureServices(this IServiceCollection services)
{
services.AddSingleton<IDatabaseService,DatabaseService>();
services.AddSingleton<IResourceService,ResourceService>();
services.AddTransient<ThemeManagementviewmodel>();
return services;
}
}
解决方法
我认为您想从视图中将一些参数传递给 viewmodel。下面的代码将完成这项工作。
为参数创建一个公共属性或变量并赋值。
public partial class ThemeManagementViewModel : BaseViewModel
{
public string Param1 {get; set;}
private readonly IResourceService _resourceService;
public ThemeManagementViewModel(IResourceService resourceService,int param1)
{
_resourceService = resourceService;
this.Param1 = param1
}
}
public class ThemeManagementPage : HeadingView
{
private readonly ThemeManagementViewModel _vm;
public ThemeManagementPage()
{
// What I need to do is to pass a parameter
// to the ViewModel which I have identified
// as a Transient (see bottom of post)
BindingContext = _vm =
Startup.ServiceProvider.GetRequiredService<ThemeManagementViewModel>();
_vm.Param1 = 10; //parameter which you want to pass
}
}
由于声誉不佳,我无法对您的问题发表评论。让我知道这可以回答您的问题。
,既然正在使用 Microsoft.Extensions.DependencyInjection nuget 包,那么请考虑使用
ActivatorUtilities.CreateInstance
方法来自包含的 Microsoft.Extensions.DependencyInjection.Abstractions.dll
使用直接提供和/或从 IServiceProvider
提供的构造函数参数实例化类型。
public class ThemeManagementPage : HeadingView {
private readonly ThemeManagementViewModel _vm;
public ThemeManagementPage(int param1) {
_vm = ActivatorUtilities.CreateInstance<ThemeManagementViewModel>(Startup.ServiceProvider,param1);
BindingContext = _vm;
}
//...
}
ActivatorUtilities.CreateInstance
方法将使用服务提供者来解析抽象,并将其与提供的其他参数一起用于在初始化时注入目标类型。
在设计方面,我不是这种服务定位器方法的特别粉丝,但这应该提供所需的行为。
这应该重新设计,以允许将所有必要的依赖项显式注入到视图模型中,而不是通过视图构造函数传递,但这取决于要注入的假定运行时参数的性质。根据目前所写的帖子,目前尚不清楚。
一些有趣的阅读Dependency Injection Code Smell: Injecting runtime data into components
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。