我已经阅读了一些关于为您管理DI的DI和DI容器。
基本上,您创建具有依赖关系的类,并使用构造函数或setter方法提供注入方法。然后告诉您的DI容器,您要使用哪些具体类来将所有内容连接在一起。最后,您调用某种服务定位器,它可以为您解析所有依赖项,并为您提供只有一行代码的复杂对象。
我从未使用过具体的DI容器实现,所以我想知道DI容器如何处理最低级别的对象。这些对象很可能必须使用具体(编码)值或配置文件的内容进行配置。以此为例:
class FooDao {
public FooDao(DBConnection db) {...}
}
class ConcreteDBConnection : DBConnection {
public ConcreteDBConnection(String url, int port, String user, String pw)
{...}
}
您可以告诉您的DI容器(使用注释,XML文件或其他内容),您希望使用ConcreteDBConnection对象来实例化您的FooDao对象。但是,如何告诉DI容器数据库连接所需的具体值?如果需要首先计算具体值(例如,加密本地存储的数据库连接信息),该怎么办?
我知道这是一个非常普遍的问题,但我读到的关于DI容器的文章也非常笼统,这一点让我很困惑。简单解释任意流行的DI框架如何做到这一点就足以回答我的问题了。
答案 0 :(得分:1)
如果您正在询问如何使用流行的DI容器,有很多关于使用Castle Windsor的文章(例如http://ardalis.com/getting-started-with-castle-windsor),当您尝试其他DI框架时,这些概念将会很熟悉。温莎城堡真的很棒 - 这是一个很好的起点。
如果您正在询问DI容器如何工作 - 这是一个较长时间的讨论,但基本知识是:
1.使用框架创建某种容器。通常和var container = new Container();
一样简单
1.使用容器注册接口(“service”)到具体类的映射。一些框架有一些神奇的功能可以为你做很多这样的事情,比如最常见的要求:如果你有一个接口IFoo和只有一个分辨率,类Foo,那么它可以自动为你注册(iirc,Autofac这样做? )
2.您要求容器解析接口 - 它将映射回到类。在解析期间,您的容器可以检查所提供的具体类的构造函数,并尝试根据其类型解析参数;同样,它可以根据类型和已知注册设置属性。