我刚开始学习Web API。我遇到了这个概念,我发现有关这方面的所有信息都非常复杂。对于像我这样的初学者来说,有没有简单的术语来解释DI。
答案 0 :(得分:0)
关于依赖注入的wikipedia文章在我第一次学习这些概念时对我很有帮助。此question和此post也有助于解释这些概念。
将依赖关系视为对象调用或运行的任何未包含在该对象中的代码可能会有所帮助。想象一下以下伪代码API控制器
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这样的依赖注入库更有意义
答案 1 :(得分:0)
我可以理解在一开始就开始处理依赖注入是多么令人困惑。虽然有些人可能会建议您阅读一本书或展示一个简短的例子,但我认为完整的示例代码会更好。
您可以查看这个使用依赖注入和Autofac容器的简单Web API服务: