【发布时间】:2019-05-21 20:39:39
【问题描述】:
.NET Core 2.2 中的内置依赖注入框架是否不在创建实例时自动解析依赖并注入实例?或者注入依赖的唯一方法是在创建新实例时显式解决它?
我正在构建一个类库项目(因此,[FromServices] 属性对我来说不是一个选项),在我看来,我几乎必须在每个类的构造函数中传递 IServiceProvider。
我是不是误会了什么?
注意:代码 sn-p 只是说明性的。
public class A
{
public A()
{
}
public void DoSomethingWithB()
{
var b = new B(// To resolve IConfiguration here, I need IServiceProvider. That means I will need to inject IServiceProvider in class A first. Will it go on nesting like this everywhere?);
}
}
public class B
{
private IConfiguration _config;
public B(IConfiguration config)
{
_config = config;
}
public void DoWork()
{
// Use _config here.
}
}
【问题讨论】:
-
如果你正在构建一个类库,那么类库的使用者负责在构造函数中传入它需要的对象。那可能是DI框架。请注意,良好实践建议
B不依赖于IConfiguration,而是一个允许消费者提供正确值的接口,方法是将其实例传递给A的构造函数 -
也许您不需要手动创建
B并在A构造函数中简单地接受B对象?您正在尝试使用Service Locator pattern,这确实是一种反模式。 -
@DavidG:是的,但正如我所见,IServiceProvider 会出现在太多地方。 .NET Core DI 本身给我一个实例怎么样,因为明确说明了依赖关系并且 DI 映射是在启动时构建的?还是 .NET Core 不支持这种模式?
-
为什么到处都需要
IServiceProvider?让 DI 通过向 DI 框架注册A来创建您的实例,同时注册B。 -
@YuriiN。是不是被微软强制使用服务定位器?
标签: asp.net-core dependency-injection .net-core