我应该在注入期间使用传递给Constructor的对象吗?

时间:2010-09-18 19:26:11

标签: c# ioc-container

我理解使用控制反转的一种(可能是最好的)方法是通过构造函数注入依赖对象(构造函数注入)。

但是,如果我使用它们调用对象 之外的这些对象,我觉得我违反了某种规则 - 是这种情况吗?我认为没有办法防止这种情况发生,但是我应该建立一个规则(在模拟对象之外)我们永远不应该从这些对象中调用方法吗?

[编辑]以下是我正在做的事情的简化示例。我有一个FileController对象,基本上用于编目文件。它使用与数据库通信的FileDal对象来插入/查询/更新FileDirectory表。

在我的实际实现中,我通过指示Castle使用DAL的SQL Server版本来构建控制器,在我的单元测试中,我使用内存的Sqlite版本的DAL。但是,由于实现DAL的方式,我需要围绕FileController的使用调用BeginTransaction和Commit,这样连接就不会被关闭,我以后可以进行检索和断言。为什么我必须这样做并不重要,但它让我认为在其他客户端(控制器)使用的DAL对象上调用方法听起来并不合适。这是一个例子:

FileDal fileDal = CastleFactory.CreateFileDal();
fileDal.BeginTransaction();
FileController fileController = new FileController(fileDal);
fileController.CallInterestingMethodThatUsesFileDal();
fileDal.Commit();

1 个答案:

答案 0 :(得分:2)

这实际上取决于对象的类型 - 但总的来说,我希望它没问题。

实际上,通常会将相同的依赖项注入到许多对象中。例如,如果你有一个IAuthenticator和几个类需要使用身份验证,那么创建一个实例并将其注入每个依赖类是有意义的,假设它们需要相同的配置。

通常发现我的依赖项是不可变的类型,它们本质上是线程安全的。当然情况并非总是如此 - 在某些情况下(至少有一些IoC容器),您可能会为特定线程或会话自动构建依赖关系 - 但是“类似服务”的依赖关系通常应该可以调用来自多个地方和线程。