如何使用参数配置 mvc core 2 依赖注入,其中一个参数是依赖项?
How do I configure mvc core 2 dependency injection with parameters, where one of the parameters is a dependency?
如果我有:
public CatManager(ICatCastle catCastle, int something)
我想将其设置为依赖注入,但我不确定如何设置。
我觉得我可以做到:
services.AddScoped<ICatCastle, CatCastle>();
services.AddScoped<ICatManager>(new CatManager(???, 42));
但我不确定要输入什么作为 ???
才能获得 CatCastle。我希望它在每次注入 CatManager
时解析一个新的 CatCastle
。
作为下一步,我想知道是否可以做类似的事情:
public CatManager(int something)
services.AddScoped<ICatManager>(new CatManager(ResolveICatCastleIntoCatCastle().SomeID));
这样 CatManager 的构造函数会自动调用 ID,而不是获取 ID 的对象。例如,如果它是一个数据库连接,我希望该解决方案在创建时发生,而不是在实际访问 属性 时发生。
您可以使用工厂委托重载。
喜欢
services.AddScoped<ICatManager>(serviceProvider =>
new CatManager(serviceProvider.GetRequiredService<ICatCastle>(), 42));
I'd like it to resolve a new CatCastle
every time CatManager
is injected.
如果你想要一座新城堡,那么你需要注册 CatCastle
瞬态作用域
services.AddTransient<ICatCastle, CatCastle>();
关于进一步的步骤public CatManager(int something)
,可以采用类似的方法
services.AddScoped<ICatManager>(serviceProvider =>
new CatManager(serviceProvider.GetRequiredService<ICatCastle>().SomeID));
在何处解析依赖项以及在将其注入依赖项之前执行了哪些操作class。
您应该将值 42
包装在 component-specific 配置 class 中,然后注册并注入该配置对象。
例如:
public class CatSettings
{
public readonly int AnswerToAllCats;
public CatSettings(int answerToAllCats) => AnswerToAllCats = answerToAllCats;
}
public class CatManager : ICatManager
{
public CatManager(ICatCastle castle, CatSettings settings) ...
}
配置看起来像
services.AddScoped<ICatManager, CatManager>();
services.AddSingleton(new CatSettings(42));
如果我有:
public CatManager(ICatCastle catCastle, int something)
我想将其设置为依赖注入,但我不确定如何设置。
我觉得我可以做到:
services.AddScoped<ICatCastle, CatCastle>();
services.AddScoped<ICatManager>(new CatManager(???, 42));
但我不确定要输入什么作为 ???
才能获得 CatCastle。我希望它在每次注入 CatManager
时解析一个新的 CatCastle
。
作为下一步,我想知道是否可以做类似的事情:
public CatManager(int something)
services.AddScoped<ICatManager>(new CatManager(ResolveICatCastleIntoCatCastle().SomeID));
这样 CatManager 的构造函数会自动调用 ID,而不是获取 ID 的对象。例如,如果它是一个数据库连接,我希望该解决方案在创建时发生,而不是在实际访问 属性 时发生。
您可以使用工厂委托重载。
喜欢
services.AddScoped<ICatManager>(serviceProvider =>
new CatManager(serviceProvider.GetRequiredService<ICatCastle>(), 42));
I'd like it to resolve a new
CatCastle
every timeCatManager
is injected.
如果你想要一座新城堡,那么你需要注册 CatCastle
瞬态作用域
services.AddTransient<ICatCastle, CatCastle>();
关于进一步的步骤public CatManager(int something)
,可以采用类似的方法
services.AddScoped<ICatManager>(serviceProvider =>
new CatManager(serviceProvider.GetRequiredService<ICatCastle>().SomeID));
在何处解析依赖项以及在将其注入依赖项之前执行了哪些操作class。
您应该将值 42
包装在 component-specific 配置 class 中,然后注册并注入该配置对象。
例如:
public class CatSettings
{
public readonly int AnswerToAllCats;
public CatSettings(int answerToAllCats) => AnswerToAllCats = answerToAllCats;
}
public class CatManager : ICatManager
{
public CatManager(ICatCastle castle, CatSettings settings) ...
}
配置看起来像
services.AddScoped<ICatManager, CatManager>();
services.AddSingleton(new CatSettings(42));