我有以下接口和类(.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>();