将 IConfiguration 注入到 .NET 6.0 上的 Windows 窗体

发布于 2025-01-15 18:51:30 字数 1761 浏览 3 评论 0原文

我有一个名为 Persistence.EFCore 的类库包含此方法

public static IServiceCollection AddPersistenceServices(this IServiceCollection services, IConfiguration configuration)
{
    services.AddDbContext<SIMContext>(options =>
           options.UseSqlServer(configuration.GetConnectionString("ConnectionString")));
    services.AddTransient<IUnitOfWork, UnitOfWork>();
    return services;
}

,这是我在 winform 项目中的 Program.cs 中的代码,

public static IConfiguration Configuration { get; }
      [STAThread]
      static void Main()
      {
         ApplicationConfiguration.Initialize();
         var builder = new HostBuilder()
         .ConfigureAppConfiguration((hostContext, builder) =>
         {
            builder.AddJsonFile("apsettings.json", optional: true, reloadOnChange: true);
            
        })
        .ConfigureServices((hostContext, services) =>
        {
            services.AddScoped<XtraMain>();
            services.AddPersistenceServices(Configuration);
            services.AddApplicationServices();
            services.AddTransient<FrmExpressionOfNeeds>();
            services.AddSingleton<IFormFactory, FormFactory>();

        });

    var host = builder.Build();
    using (var serviceScope = host.Services.CreateScope())
    {
        IServiceProvider services = serviceScope.ServiceProvider;
        XtraMain mainform = services.GetRequiredService<XtraMain>();
        System.Windows.Forms.Application.Run(mainform);
    }
}

我找不到设置配置值的方法。
IConfiguration 中的配置应该从中获取他的值,

Configuration = builder.Build();

但就我而言,它是

services.AddPersistenceServices(Configuration);

在构建之前出现的

I have class library called Persistence.EFCore contains this method

public static IServiceCollection AddPersistenceServices(this IServiceCollection services, IConfiguration configuration)
{
    services.AddDbContext<SIMContext>(options =>
           options.UseSqlServer(configuration.GetConnectionString("ConnectionString")));
    services.AddTransient<IUnitOfWork, UnitOfWork>();
    return services;
}

and this is my code from Program.cs in winform project

public static IConfiguration Configuration { get; }
      [STAThread]
      static void Main()
      {
         ApplicationConfiguration.Initialize();
         var builder = new HostBuilder()
         .ConfigureAppConfiguration((hostContext, builder) =>
         {
            builder.AddJsonFile("apsettings.json", optional: true, reloadOnChange: true);
            
        })
        .ConfigureServices((hostContext, services) =>
        {
            services.AddScoped<XtraMain>();
            services.AddPersistenceServices(Configuration);
            services.AddApplicationServices();
            services.AddTransient<FrmExpressionOfNeeds>();
            services.AddSingleton<IFormFactory, FormFactory>();

        });

    var host = builder.Build();
    using (var serviceScope = host.Services.CreateScope())
    {
        IServiceProvider services = serviceScope.ServiceProvider;
        XtraMain mainform = services.GetRequiredService<XtraMain>();
        System.Windows.Forms.Application.Run(mainform);
    }
}

I can't find a way to set the Configuration value.
The Configuration from IConfiguration supposed to get his value from

Configuration = builder.Build();

But in my case the

services.AddPersistenceServices(Configuration);

came before the build

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半城柳色半声笛 2025-01-22 18:51:30

ConfigureService((context, services)=>{ ... })HostBuilderContext 允许您使用其 配置 属性。

因此,假设您有一个接受配置的服务扩展方法,那么您可以使用 context.Configuration 轻松地将配置传递给它。

示例

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
internal static class Program
{
    [STAThread]
    static void Main()
    {
        ApplicationConfiguration.Initialize();
        var host = CreateHostBuilder().Build();
        Application.Run(host.Services.GetRequiredService<Form1>());
    }
    static IHostBuilder CreateHostBuilder() =>
        Host.CreateDefaultBuilder()
            .ConfigureServices((context, services) =>
            {
                services.AddHelloServices(context.Configuration);
                services.AddTransient<Form1>();
            });
}

The first parameter of ConfigureService((context, services)=>{ ... }) is HostBuilderContext which gives you access to configuration, using its Configuration property.

So assuming you have a service extension method which accepts configuration, then you can easily pass configuration to it using context.Configuration.

Example

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
internal static class Program
{
    [STAThread]
    static void Main()
    {
        ApplicationConfiguration.Initialize();
        var host = CreateHostBuilder().Build();
        Application.Run(host.Services.GetRequiredService<Form1>());
    }
    static IHostBuilder CreateHostBuilder() =>
        Host.CreateDefaultBuilder()
            .ConfigureServices((context, services) =>
            {
                services.AddHelloServices(context.Configuration);
                services.AddTransient<Form1>();
            });
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文