代码之家  ›  专栏  ›  技术社区  ›  Otávio Décio

我应该在注入期间使用传递给构造函数的对象吗?

  •  1
  • Otávio Décio  · 技术社区  · 14 年前

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

    但是,如果我调用这些对象 外部 关于使用它们的对象,我觉得我违反了某种规则——是这样吗?我不认为有任何方法可以阻止这种情况的发生,但是我应该建立一个规则,即(在模拟对象之外)我们不应该从这些对象调用方法吗?

    [编辑]这里是我正在做的事情的简化示例。我有一个 FileController 对象,它主要用于对文件进行编目。它使用 FileDal 与要插入/查询/更新的数据库对话的对象 File Directory 桌子。

    在我的实际实现中,我通过指示Castle使用DAL的SQL服务器版本来构建控制器,在我的单元测试中,我使用DAL的内存中的sqlite版本。但是,由于DAL的实现方式,我需要调用BeginTransaction并围绕 文件控制器 所以连接不会被关闭,稍后我可以进行检索和断言。为什么我必须这样做并不重要,但这让我想到,对其他客户机(控制器)使用的DAL对象调用方法听起来不太像犹太教徒。下面是一个例子:

    FileDal fileDal = CastleFactory.CreateFileDal();
    fileDal.BeginTransaction();
    FileController fileController = new FileController(fileDal);
    fileController.CallInterestingMethodThatUsesFileDal();
    fileDal.Commit();
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Jon Skeet    14 年前

    这真的取决于对象的类型——但一般来说,我希望这没问题。

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

    通常 发现我的依赖项是不可变的类型,它们自然是线程安全的。当然,情况并非总是如此——在某些情况下(至少有一些IOC容器),您可能会自动构建依赖项,使其适用于特定线程或会话——但是“服务类”依赖项通常可以从多个位置和线程调用。