【问题标题】:How to perform dependency injection through Microsoft.Extensions.Hosting in wpf如何在 wpf 中通过 Microsoft.Extensions.Hosting 执行依赖注入
【发布时间】:2021-02-14 14:35:25
【问题描述】:

不是以下问题中提到的解决方案。 Dependency Injection in .NET Core 3.0 for WPF 而是通过在csproj文件中添加<EnableDefaultApplicationDefinition>false</EnableDefaultApplicationDefinition>来防止App.xaml自动生成Main方法,从而达到类似ASP.NET core的依赖注入的效果。

看过一段非常漂亮的代码,通过IServiceProvider获取一个App实例调用Application.Run(),但是现在想不起来了,也想不起来原​​代码的出处. 任何人都可以帮忙吗?非常感谢。

我目前的代码如下。

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    class Program
    {
        [STAThread]
        public static void Main()
        {
            Host.CreateDefaultBuilder()
                .ConfigureServices(ConfigureServices)
                .Build()
                .Run();
        }

        private static void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<App>();
            services.AddSingleton<MainWindow>();
        }
    }

我需要获取 App 类的实例来调用 Application.Run()。

【问题讨论】:

    标签: c# wpf dependency-injection


    【解决方案1】:

    IServiceProvider 可以在IHost.Services 中找到。

    class Program
    {
        [STAThread]
        public static void Main()
        {
            var host = Host.CreateDefaultBuilder()
                .ConfigureServices(ConfigureServices)
                .Build();
            host.RunAsync();
    
            var app = host.Services.GetService<App>();
            app.Run();
        }
    
        private static void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<App>();
            services.AddSingleton<MainWindow>();
        }
    }
    

    【讨论】:

      【解决方案2】:

      对我来说可行的解决方案是:

          internal class Program
          {
              [STAThread]
              public static void Main()
              {
                  var host = Host.CreateDefaultBuilder()
                      .ConfigureServices(ConfigureServices)
                      .Build();
      
                  var app = host.Services.GetService<App>();
                  if(app != null)
                  {
                      app.InitializeComponent();
                      app.Run();
                  }
              }
      
              private static void ConfigureServices(IServiceCollection services)
              {
                  services.AddSingleton<App>();
                  services.AddSingleton<MainWindow>();
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-12
        • 2021-02-26
        • 2019-12-03
        • 2019-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多