我正在尝试更新我的依赖项注入以使用 Microsoft 内置的依赖项注入,而不是使用已弃用的 Unity 依赖项注入。
Unity 有以下解析:Resolve(Type t, string name, params ResolverOverride[]resolverOverrides);
我试图用 ServiceProvider 做同样的事情,但没有这样的功能。是否有服务提供商功能可以执行此操作?
经过一些研究,我发现使用 ActivatorUtilities 创建实例可以解决我的问题,但是我需要 object[] 参数的帮助。我需要一个与 ResolverOverride 相似(即使不完全相同)的解决方案,但我不再想使用 Unity 包。有没有一个类的行为完全像这样?
如果没有,我在哪里可以找到 ParameterOverride 的源代码,以便我可以自己制作该类。使用Google,我只能找到Microsoft Documentation,但它不包含任何有用的信息
没有等效的方法,但有一个解决方法。
当您注册这样的类型时
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
));
缺点是,因为您要调用类的构造函数,所以必须指定每个参数。这是不要有太多构造函数参数的另一个好理由。