C# 如何将参数发送到获取以下引用的ViewModel:Startup.ServiceProvider.GetRequiredService?
谁能给我一些建议吗。我正在使用 Microsoft.Extensions.DependencyInjection 5.0.1版nuget软件包 我想获得一个对需要服务注入的ViewModel类的引用,同时向ViewModel传递一个参数。这里我有一个例子 我的类调用的ViewModel也需要向其传递参数。有人能告诉我怎么做吗C# 如何将参数发送到获取以下引用的ViewModel:Startup.ServiceProvider.GetRequiredService?,c#,.net,xamarin,xamarin.forms,dependency-injection,C#,.net,Xamarin,Xamarin.forms,Dependency Injection,谁能给我一些建议吗。我正在使用 Microsoft.Extensions.DependencyInjection 5.0.1版nuget软件包 我想获得一个对需要服务注入的ViewModel类的引用,同时向ViewModel传递一个参数。这里我有一个例子 我的类调用的ViewModel也需要向其传递参数。有人能告诉我怎么做吗 public class ThemeManagementPage : HeadingView { private readonly ThemeManagementV
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
}
}
public类主题管理页面:标题视图
{
私有只读管理视图模型_vm;
公共主题管理页面(int参数1)
{
//使用参数调用此页,然后
//我需要做的是传递参数'param1'`
//到我已识别的ViewModel
//作为一个过渡(见文章底部)
BindingContext=\u vm=
Startup.ServiceProvider.GetRequiredService();
}
}
公共部分类TheeManagementViewModel:BaseViewModel
{
专用只读IResourceService\u resourceService;
公共主题管理视图模型(IResourceService resourceService,int参数1)
{
_resourceService=resourceService;
变量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;
}
}
公共部分类ResourceService:IResourceService
{
专用IDatabaseServiceU数据库服务;
公共资源服务(IDatabaseService数据库服务)
{
_databaseService=数据库服务;
}
}
公共接口IResourceService
{
void setResourceColor();
}
公共静态类启动
{
公共静态IServiceProvider服务提供程序{get;set;}
公共静态IServiceProvider Init()
{
var serviceProvider=new servicecolection().ConfigureServices()
.BuildServiceProvider();
服务提供者=服务提供者;
返回服务提供商;
}
}
公共静态类DependencyInjectionContainer
{
公共静态IServiceCollection配置服务(此IServiceCollection服务)
{
services.AddSingleton();
services.AddSingleton();
services.AddTransient();
返回服务;
}
}
我想您想从视图向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
}
}
public分部类管理视图模型:BaseViewModel
{
公共字符串Param1{get;set;}
专用只读IResourceService\u resourceService;
公共主题管理视图模型(IResourceService resourceService,int参数1)
{
_resourceService=resourceService;
this.Param1=Param1
}
}
公共类主题管理页面:标题视图
{
私有只读管理视图模型_vm;
公共主题管理页面()
{
//我需要做的是传递一个参数
//到我已识别的ViewModel
//作为一个过渡(见文章底部)
BindingContext=\u vm=
Startup.ServiceProvider.GetRequiredService();
_vm.Param1=10;//要传递的参数
}
}
由于名声不好,我无法对你的问题发表评论。让我知道这回答了你的问题。< p>自从使用MySt.ExtExist.RealEngyStudio NuGET包后,考虑使用 包含的
Microsoft.Extensions.DependencyInjection.Abstractions.dll中的方法
使用直接提供的构造函数参数和/或从IServiceProvider
实例化类型
public类主题管理页面:标题视图{
私有只读管理视图模型_vm;
公共主题管理页面(int参数1){
_vm=ActivatorUtilities.CreateInstance(Startup.ServiceProvider,param1);
BindingContext=\u虚拟机;
}
//...
}
ActivatorUtilities.CreateInstance
方法将使用服务提供程序来解析抽象,并在初始化目标类型时将其与提供的其他参数一起注入目标类型
就设计而言,我并不特别喜欢这种服务定位器方法,但这应该提供所需的行为
这应该重新设计,以允许将所有必要的依赖项显式注入视图模型,而不是通过视图构造函数传递,但这取决于要注入的假定运行时参数的性质。根据目前所写的帖子,目前还不清楚
一些有趣的阅读当页面被调用时,一个参数被传递给它。例如,一个Id可能被传递到一个显示汽车信息的页面。然后,我想为该页面创建一个ViewModel,并需要将Id值传递给该视图模型。Ranjit提到刚刚做了_vm.Param1=10,但我不确定这是否正确。在我开始使用DI之前,我只是在做_vm=新的ThemeManagementViewModel(Id);但是现在有了DI,我不能100%确定如何正确地完成它。
public class ThemeManagementPage : HeadingView {
private readonly ThemeManagementViewModel _vm;
public ThemeManagementPage(int param1) {
_vm = ActivatorUtilities.CreateInstance<ThemeManagementViewModel>(Startup.ServiceProvider, param1);
BindingContext = _vm;
}
//...
}