【发布时间】:2022-12-18 07:27:07
【问题描述】:
我有一个服务使用一组实现接口IX的服务:
public class MyService()
{
MyService(IEnumerable<IX> xs)
{
// Store xs in some field and later use them repeatedly.
}
}
我想要一个类 MyX 实现 IX 的多个实例:
public class MyX : IX
{
public string Field { get; }
public MyX(string field)
{
Field = field;
}
}
我将其中一些添加为单身人士:
builder.Services.AddSingleton<IX>(new MyX("field value 1"));
builder.Services.AddSingleton<IX>(new MyX("field value 2"));
[更新]...或来自配置:
builder.Services.AddSingleton(configuration.GetSection("xs").Get<IEnumerable<MyX>>());
此实现按预期工作:我的服务现在有一个 IEnumerable,它包含 MyX 的两个不同实例。
但是,我需要向 MyX 类添加一个记录器。我试试这个:
public class MyX : IX
{
ILogger<MyX> _logger;
public string Field { get; }
public X(ILogger<MyX> logger, string field)
{
_logger = logger;
Field = field;
}
}
但是现在我无法在服务设置期间构造MyX,因为我还没有记录器:
builder.Services.AddSingleton<IX>(new MyX(/* But where would I get a logger? */, "field value 1"));
我多次遇到这个问题的变体。总的来说,感觉 DI 希望我将我的类分成某种形式的多阶段构造(第一个字段,然后在服务解析时添加记录器)。这需要将 MyX 分成 MyXFactory 和 MyX,但这似乎有点尴尬。
构造一些 MyX 实例以用于依赖项注入的正确方法是什么?
【问题讨论】:
标签: c# asp.net .net-core dependency-injection