使用Net Core默认依赖注入(DI)注入字符串和服务

3
我有一个Net Core 2.1控制台应用程序,我在其中执行类似于以下操作的任务:
class Program
{
    static void Main(string[] args)
    {
        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", false)
            .Build();

        var fullPath = configuration.GetValue<string>("tempPath:fullPath");

        serviceCollection.AddTransient<MyService>();
        serviceCollection.AddTransient<Worker>();
        ...


public class Worker
{
    public string FullPath {get; set;}
    private readonly MyService _myService;

    public Worker(MyService myService,
        string fullpath)
    {
        _myService = myService;
        FullPath=fullpath;
    }

换句话说,我需要以某种方式在Worker类中注入服务和配置字符串。有人能建议我正确的方法吗?

4
注入配置对象,而不是原始字符串。 - Panagiotis Kanavos
5
有一个名为“ IOptions”模式的概念。https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.0 - Eldar
1个回答

2
只需更改您的DI配置如下:
var fullPath = configuration.GetValue<string>("tempPath:fullPath");
serviceCollection.AddTransient<MyService>();
serviceCollection.AddTransient<Worker>(x => new Worker(x.GetRequiredService<MyService>(), fullPath));

或者按照建议,使用IOptions接口将配置对象注入到类中。


1
或者使用配置对象和 IOption。不是我点的踩,我认为这并不合理。.NET Core已经有了适当的机制。 - Panagiotis Kanavos
有很多方法可以实现这个。就我个人而言,我不喜欢我的类依赖于 IConfiguration,因为这样会让你读取每个配置值。但是关于 IOptions 的观点很好。 - Jamie Rees
虽然这可行,但有点反模式。像 services.Configure 这样的东西存在的原因是有道理的。 - DavidG
他们根本不需要访问IConfiguration。只需要一个包含这些值的强类型对象。该对象可以从配置值构建,甚至可以显式创建和注册。 - Panagiotis Kanavos
如果您想使用命令行动词和选项,例如,“config”对象将来自命令行解析器,而不是配置中间件。服务不必知道任何一种方式。 - Panagiotis Kanavos
2
想象一下有20个类,它们至少注入了5个其他服务,这些服务又注入了其他一些服务。而仅仅为了注入一个字符串值,你需要手动配置它们如上所述。 - Eldar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接