Dependency injection DI容器和具体值/配置数据

Dependency injection DI容器和具体值/配置数据,dependency-injection,di-containers,Dependency Injection,Di Containers,我已经读了一些关于DI和为您管理DI的DI容器的内容 基本上,您可以创建具有依赖关系的类,并使用构造函数或setter方法提供注入方式。然后告诉DI容器,希望使用哪些具体类将所有内容连接在一起。最后,调用某种服务定位器,它为您解析所有依赖项,并为您提供只需一行代码的复杂对象 我从未使用过具体的DI容器实现,因此我想知道DI容器如何在最低级别处理对象。这些对象很可能必须使用具体(编码)值或配置文件的内容进行配置。以此为例: class FooDao { public FooDao(DBCo

我已经读了一些关于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框架是如何做到这一点的,就足以回答我的问题。

如果你问如何使用流行的DI容器,有很多关于使用Castle Windsor(如)的文章,当你尝试其他DI框架时,这些概念会很熟悉。温莎城堡确实不错,是一个很好的起点

如果您要问DI容器是如何工作的——这是一个较长的讨论,但基本内容是: 1.您可以使用框架创建某种容器。通常就像
var container=newcontainer()一样简单
1.在容器中注册接口(“服务”)到具体类的映射。一些框架有一些魔力可以为您完成很多这方面的工作,比如最常见的需求:如果您有一个接口IFoo,并且只有一个解析,即类Foo,那么它可以自动为您注册(iirc,Autofac可以做到这一点吗?)

2.您要求容器解析接口——它将接口映射回类。在解析过程中,容器可以检查所提供的具体类的构造函数,并尝试根据其类型解析参数;类似地,它可以根据属性的类型和已知注册设置属性。

我在问如何注入具体的值。为接口注册具体类非常简单,但在我读到的每一篇关于Di容器的文章中,它们最终都是没有任何依赖关系的“叶类”。我发现这有点奇怪,因为在整个对象层次结构中必须注入大量的配置数据。如果在很多地方都要注入配置数据,我们通常会有一个像
iaapplicationconfig
这样的接口,可以通过构造函数注入。具体的实现可以手动注册(例如,Windsor可以进行单例注册),也可以通过DictionaryAdapter从app.config获取配置。请记住,注册不一定是暂时的——它们的生命周期依赖于线程、http请求、,所以有可能注册可以在代码中预先初始化的类吗?IApplicationConfig方法似乎是一种很好的方法,至少如果DI容器提供了为特定类指定所需具体应用程序配置的选项(或者您只需创建一个管理所有配置值加载的ApplicationConfig类)。是的,您如何做到这一点取决于您使用的DI框架,但例如,Castle Windsor允许这样的操作:
container.Register(Component.for().Instance(myT))您还可以使用工厂方法注册组件以完全管理构造,也可以挂接到销毁中以管理非托管资源。看看温莎城堡的文档/示例——这是一个很好的起点。请参阅和