2010-09-18 22 views
1

我知道使用控制反转的(也许是最好的)方法之一是通过构造函数(构造函数注入)注入依赖对象。我应该在注入期间使用传递给构造函数的对象吗?

但是,如果我打电话给这些对象外部使用它们的对象,我觉得我违反了某种规则 - 是这种情况吗?我不认为有什么办法可以防止这种情况发生,但是我应该建立一个规则(除了被嘲笑的对象之外),我们不应该从这些对象中调用方法?

[编辑]这是我正在做的一个简单的例子。我有一个FileController对象,基本上用于编目文件。它使用与数据库交谈的FileDal对象来插入/查询/更新FileDirectory表。

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

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

我很感兴趣的是看到一个简单的例子,你正在做什么。这可以让我们更多地了解你的特定情况。 – Steven 2010-09-18 20:04:46

回答

2

它确实取决于对象的类型 - 但总的来说,我希望这样可以。

确实,相同的依赖关系通常会被注入到很多对象中。例如,如果您有一个IAuthenticator以及需要使用身份验证的几个类,则假设他们需要相同的配置,创建一个实例并将其注入到每个相关类中都是有意义的。

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

+0

谢谢,乔恩。在我的情况下,他们大多是DAL对象,你确实是正确的,他们通过Castle创建,然后传递给各种“控制器”。我问,因为我正在编写单元测试,而且我必须发起并终止客户端对象之外的一个事务*,这种感觉不正确。哦,顺便说一句,我*不*与真正的数据库交谈,我正在使用内存中的Sqlite进行单元测试。 – 2010-09-18 19:37:46

相关问题