如何正确使用DI创建构造函数中有参数的对象?例如。 int ID。
public class SomeClass
{
public SomeClass(int id)
{
Id = id;
}
public int Id {get;}
}
考虑存储 Id 列表的 ini 文件。我想读取这些值并为每个创建具有特定 id 的 SomeClass 实例。
List<int> ids = readIdsFromIni();
foreach(var id in ids)
{
???
}
我认为某个地方应该是 SomeClass 的注册,就像这样
var builder = Host.CreateApplicationBuilder(e.Args);
builder.Services.AddTransient<SomeClass>();
现在我在这些情况下使用抽象工厂,但在这个工厂中我使用直接调用 new SomeClass(id);
谢谢你 彼得
您的描述缺少很多信息,因此很难理解您将如何使用这些,但您可以这样做 -
foreach (int id in ids)
{
builder.Services.AddSingleton(serviceProvider => new SomeClass(id))
}
这将为您从文件中读取的每个 ID 注册一个
SomeClass
的实现。请注意,这实际上不会创建实例,它们只会被创建一次(并且如果需要的话)以满足某些其他要求。例如,您可以拥有一个具有如下所示构造函数的服务 -
public class MyService
{
public MyService(IEnumerable<SomeClass> things)
{
// in here, "things" will contain instances for all
// of the implementations you've registered
}
}