应用程序中的构造函数注入,其中可能无法初始化依赖项

时间:2010-08-12 14:55:50

标签: constructor inversion-of-control

我的应用程序能够在没有数据库连接的情况下启动,如何使用IoC和构造函数注入来处理它?<​​/ p>

示例:

public class ApplicationShellPresenter(IRepository repository, IView view)
{

}

当构建这种情况下的IRepository时,由于DAL无法找到配置/文件,错误的用户名/密码等等,将抛出异常。

考虑到这一点,我得出的结论是,我无法在构造函数中注入存储库,或者注入最终沿着行将IRepository作为依赖项的任何东西。

我需要在没有IRepository依赖的情况下启动,当用户进行了正确的数据库设置时,请在容器中注册IRepository。但后来我已经离开了作文根。

修改

我的问题不是IoC / Constructor注入 - 问题,而是我们的DAL底层设计缺陷。

我们的DAL正在创造时自我构建。这就是为什么这个设计不起作用,因为我不能构建一个IRepository依赖,而不构建我们的DAL引擎。

我的简单解决方案是包装我们的DAL,这样它就不会在创建时自行构建。

2 个答案:

答案 0 :(得分:1)

进一步采取行动。如果我理解正确,我们有:

Application Starts

User specifies some database settings

Repository initialises, passwords etc are checked

Application now uses repository

我的直接想法是,嗯,想知道我们是否也能得到

User decides "I don't like that repository"

User specified new database settings

New repository is initialised

Application closes previous repository, and starts working with new one.

现在它可能比你计划的稍微灵活一点,但它让我有了两个应用程序,它们之间存在暂时的关系。有一个独立于存储库的“shell”,它是在没有存储库的情况下启动的。然后有额外的部分只有当它有一个存储库时才有效,而且我认为它似乎是可插拔的,至少在概念上是这样。

因此,我不认为你的shell是如此多的“注入”响应有趣的事件,如:

Here is a repository, if you already have one please close it

Shut down, please close down your repository, and then yourself.

如果你有一个事件界面,我认为你得到了你需要的东西。事件的到来实际上是注射。

答案 1 :(得分:1)

请参阅how I would do it