Microsoft.Extensions.DependencyInjection 中的 Microsoft.Practices.Unity ResolverOverride 等效项是什么

问题描述 投票:0回答:1

我正在尝试更新我的依赖项注入以使用 Microsoft 内置的依赖项注入,而不是使用已弃用的 Unity 依赖项注入。

Unity 有以下解析:Resolve(Type t, string name, params ResolverOverride[]resolverOverrides);

我试图用 ServiceProvider 做同样的事情,但没有这样的功能。是否有服务提供商功能可以执行此操作?

经过一些研究,我发现使用 ActivatorUtilities 创建实例可以解决我的问题,但是我需要 object[] 参数的帮助。我需要一个与 ResolverOverride 相似(即使不完全相同)的解决方案,但我不再想使用 Unity 包。有没有一个类的行为完全像这样?

如果没有,我在哪里可以找到 ParameterOverride 的源代码,以便我可以自己制作该类。使用Google,我只能找到Microsoft Documentation,但它不包含任何有用的信息

c# .net dependency-injection service-provider
1个回答
0
投票

没有等效的方法,但有一个解决方法。

当您注册这样的类型时

services.AddTransient<SomeType>();

...然后当它被解析时,

ServiceProvider
也会根据已注册的内容解析其构造函数参数。

如果您想覆盖该类型,则必须使用可让您指定各种参数的函数来注册类型。然后你就可以更好地控制它们。

例如,

services.AddTransient<SomeClass>(serviceProvider =>
    new SomeClass(
        serviceProvider.GetRequiredService<IWhatever>(),
        serviceProvider.GetRequiredService<SomeSpecificTypeOtherImplementation>()
    ));

实际的构造函数参数类型可能是

ISomeSpecificType
,并且可能注册了一个不同的具体类作为其实现。但现在,当创建
SomeClass
时,它将解析具体类型,而不是解析该接口的注册实现。

假设您也注册了该类型。

services.AddTransient<SomeSpecificTypeOtherImplementation>();

它不必是在容器中注册的类型。你也可以这样做

services.AddTransient<SomeClass>(serviceProvider =>
    new SomeClass(
        serviceProvider.GetRequiredService<IWhatever>(),       
        new SomeSpecificTypeOtherImplementation() // not resolved
    ));

缺点是,因为您要调用类的构造函数,所以必须指定每个参数。这是不要有太多构造函数参数的另一个好理由。

© www.soinside.com 2019 - 2024. All rights reserved.