动态配置根?基于db调用?

时间:2017-10-02 16:19:57

标签: dependency-injection architecture inversion-of-control ninject dependency-inversion

我有一个应用程序,在启动时知道就足以选择数据库并提取配置对象。

然后在该配置对象上执行,在循环中处理一堆内容,拉出另一个配置对象,在其上执行等。

现在,我在应用程序的开头有一个配置根,可以配置它可以做的一切。但是因为它在db调用之后才知道所有内容,所以在该点之后的所有对象分支都隐藏在工厂的工厂之后,因此它们可以处理配置对象中发生的任何配置。

我的问题是,这是正常的吗?看起来替代方案是拥有两个配置根或两个DI容器。一个之前,一个在db调用之后。

如果我可以在db调用之后执行我的DI根目录,我就可以将内容直接连接到容器中,从而从我的代码中删除大量工厂,这只是存在,因为在应用程序启动时,我我不确定需要什么。但这似乎很奇怪。这也意味着我必须在每次迭代时重新创建我的容器或第二个容器,这看起来很奇怪。

编辑:我刚刚发现StructureMap有一个嵌套容器功能,几乎就是这个用例,所以我肯定会在这里找到一些东西:http://structuremap.github.io/the-container/nested-containers/

编辑:我没有得到任何回复,但无论如何能够稍后回答这个问题。我在下面添加了答案。

1 个答案:

答案 0 :(得分:0)

事实证明这是一种相对常见的情况。

第一步是认识到我的很多困惑来自于我的应用程序正在被重构,但还没有明确的pub / sub架构。

一旦完成,很明显,运行数据库前后的代码可能真的被视为单独的应用程序。

那时,我基本上有两个选择。我可以将它们视为单独的应用程序,在这种情况下,它们每个都有自己的独立di root。

或者,或者,我可以继续在它们之间共享代码,并使用嵌套容器。

显然,大多数IoC(我检查过Unity,StructureMap和WindsorCastle)都有一些方法可以将父容器/配置对象传递给子项目,并让它在该项目的范围内克隆和覆盖特定的注册。

因此,我的初始项目可以配置数据库和日志记录连接等,然后每个子项目实例都可以根据从数据库调用中获取的任何数据来扩展该共享配置实例。

事实证明,我一直在使用的IoC,SimpleInjector,无法做到这一点。亨西是我困惑的一部分。