如何使用参数配置 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));