微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将参数发送到我通过以下方式获得引用的 ViewModel:Startup.ServiceProvider.GetRequiredService?

如何解决如何将参数发送到我通过以下方式获得引用的 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 举报,一经查实,本站将立刻删除。