收集。AddTransient<IB>(_ => new B(x)) 其中 arg 是另一个注入的类 A.GetX() 的返回?



我有以下接口和类(.Net core 3.1控制台应用程序(。

public interface IA { string GetX(); }
public class A 
{ 
public GetX() { return "Test"; } 
}
public interface IB { void DoSomething(); }
public class B 
{
public B(string x) { /*...*/ } // need to call A.GetX() for x
public void DoSomething() { /*....*/ }
}

在下面的控制台应用程序中,它表明collection.AddTransient<IB>(_ => new B(x))需要A.GetX()返回的值x。但是,在设置B之前,集合已经为A构建

了?
static void Main(string[] args)
{
var collection = new ServiceCollection();
collection.AddTransient<IA, A>();
var serviceProvider = collection.BuildServiceProvider(); // Had to build now to call a.GetX() for B
var a = serviceProvider.GetService<IA>();
var x = a.GetX();
if (!Validated(x))
{
// log the error, etc.
return; // exit
}
collection.AddTransient<IB>(_ => new B(x)); 
// However, serviceProvider was already built? 
var b = serviceProvider.GetService<IB>();

更早地构建服务提供程序不是正确的解决方案

问题是你忽略了,甚至用传统的_命名它,提供给你的工厂代表的参数。

此参数是服务提供程序。

这是它的使用方式。

var collection = new ServiceCollection();
collection.AddTransient<IA, A>();
collection.AddTransient<IB>(provider => {
var a = provider.GetService<IA>();
var x = a.GetX();
return new B(x);
}); 
var serviceProvider = collection.BuildServiceProvider();
var b = serviceProvider.GetService<IB>();

最新更新