【发布时间】:2018-02-07 15:44:03
【问题描述】:
我刚开始学习 Web api。我遇到了这个概念,我发现有关此的所有信息都非常复杂。对于像我这样的初学者,是否有任何来源可以简单地解释 DI。
【问题讨论】:
-
阅读本书Dependency Injection in .NET。这是理解 Internet 上(通常是误导性的)信息的最佳方式。
标签: asp.net-web-api dependency-injection
我刚开始学习 Web api。我遇到了这个概念,我发现有关此的所有信息都非常复杂。对于像我这样的初学者,是否有任何来源可以简单地解释 DI。
【问题讨论】:
标签: asp.net-web-api dependency-injection
wikipedia 关于依赖注入的文章对我第一次学习这些概念很有帮助。这个question 和这个post 也有助于很好地解释这些概念。
将依赖项视为对象调用或运行但不包含在该对象中的任何代码可能会有所帮助。想象一下下面的伪代码 API Controller
public class MyController: ApiController {
public IHttpActionResult Get(string id) {
var databaseConnection = new DatabaseConnection("example connection string");
databaseConnection.Open();
var myRecords = databaseConnection.RunAQuery("some SQL");
var mapper = new RecordToDataModelMapper();
return mapper.map(myRecords);
}
}
如果以后我们需要更改数据库连接字符串怎么办?或者,如果我想更改类 DatabaseConnection 或 RecordToDataModelMapper 怎么办?如果我们在这个控制器或调用相同代码的其他控制器中有多个方法,这将变得越来越混乱。因此,与其使用 new 关键字和构造函数来创建其方法/代码我们的控制器所依赖的新对象,我们可以只要求将实现接口的对象的实例注入到控制器的构造函数中
public class MyController: ApiController {
private IDatabaseConnection _databaseConnection;
private IRecordToDataModelMapper _mapper;
public ApiController(IDatabaseConnection databaseConnection,
IRecordToDataModelMapper mapper) {
_databaseConnection = databaseConnection;
_mapper = mapper;
}
public IHttpActionResult Get(string id) {
databaseConnection.Open();
var myRecords = _databaseConnection.RunAQuery("some SQL");
return mapper.map(myRecords);
}
}
现在可以更轻松地对依赖类进行更改。控制器所关心的是它接收在构造函数中实现接口的对象。那么这些对象是如何被实例化的,哪些代码负责将它们传递给控制器构造函数呢?答案很神奇。不是真的,真正的答案是某种容器对象。您可以尝试自己编写一个容器,但通常使用像 autofac 这样的依赖注入库更有意义
【讨论】:
我可以理解从一开始就开始处理依赖注入是多么令人困惑。虽然有些人可能会建议您阅读一本书或展示一个简短的示例,但我认为完整的示例代码会有所帮助。
你可以看看这个简单的 Web API 服务,它使用依赖注入和 Autofac 容器:
【讨论】: