如何从Main内部获取IConfiguration? [英] How to get IConfiguration from within Main?

查看:35
本文介绍了如何从Main内部获取IConfiguration?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下内容仅供参考.

我有一个 secrets.json ,其内容如下:

I have a secrets.json with the following contents:

{   
  "Message": "I still know what you did last summer."
}

我需要使用以下播种器为数据库播种.

And I need to seed the database with the following seeder.

public static class SeedData
{
    public static void Initialize(IServiceProvider isp, IConfiguration c)
    {
        using (var context = isp.GetRequiredService<MyContext>())
        {
            if (context.Members.Any())
                return;

            context.Members.AddRange
            (
                new Member
                {
                    Message= c["Message"]
                }
            );

            context.SaveChanges();
        }
    }
}

播种器在 Main 内部调用如下.

The seeder is invoked inside Main as follows.

public static void Main(string[] args)
{
    IWebHost iwh = BuildWebHost(args);

    using (IServiceScope iss = iwh.Services.CreateScope())
    {
        IServiceProvider isp = iss.ServiceProvider;
        try
        {
            // IConfiguration c = ?????? 
            SeedData.Initialize(isp, c);
        }
        catch (Exception ex)
        {
            ILogger<Program> logger = isp.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred seeding the DB.");
        }
    }
    iwh.Run();
}

问题

如何从 Main 获取 IConfiguration c ?

推荐答案

您将执行与 MyContext 服务相同的操作:

You would do just as you do for your MyContext service:

var configuration = isp.GetRequiredService<IConfiguration>();

最好将两个依赖项都传递给 SeedData.Initialize 而不是依赖项和IoC容器:

It'd be better if you passed both dependencies to SeedData.Initialize instead of a dependency and the IoC container:

public static void Initialize(MyContext context, IConfiguration config)
{
    ...
}

IServiceProvider isp = iss.ServiceProvider;
try
{ 
    var configuration = isp.GetRequiredService<IConfiguration>();
    var context = isp.GetRequiredService<MyContext>();
    SeedData.Initialize(context, configuration);
}

这样,您至少要避免使用 Initialize 方法中的Service Locator反模式.

With this, you at least avoid the Service Locator anti-pattern in the Initialize method.

这篇关于如何从Main内部获取IConfiguration?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆