C# 如何将参数发送到获取以下引用的ViewModel:Startup.ServiceProvider.GetRequiredService?

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

谁能给我一些建议吗。我正在使用

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
    }
 }
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;
    }

    //...
 }