当构造函数的参数不可用时,PHP依赖注入

我们刚刚开始齐心协力在项目中统一使用依赖注入,而且我遇到了一个问题.

我正在编写一个类来处理MongoDB查询.我传入一个MongoClient作为构造函数的依赖,没有问题.但是,如果在实例化时实例化对象所需的变量不可用,我该如何处理依赖?

特别是,我们有一个MongoCollection方法的包装器,findOne,如果你传入一个字符串,当前(在旧代码中)将该字符串转换为带有“new MongoId($_ id)”的MongoId,并将其用于查找功能.

根据我对依赖注入的了解,使用“new MongoId”是一个坏主意,而且我已经知道它会使为字符串转换为MongoId的函数编写测试用例变得更加困难.

但是当MongoId类在构造函数上获取id字符串时,如何处理注入?

我唯一能想到的就是在类构造函数上传递一个闭包,它执行以下操作:

$getMongoId = function( $id ){
    return new MongoId( $id );
};

class MyMongo
{
   function __construct( MongoClient $client, Closure $mongoIdGetter){...}
}

[编辑修复此最后一部分]

但这是处理它的正确方法吗?当然,如果我们使用DiC,我们可以做到,但需要一个闭包构造函数似乎有点多.我是否因为注入我的依赖关系而过于教条?我想可以通过在新类中使用“new MongoId($_ id)”来轻松解决这个问题.

最佳答案
您可以使用工厂代替关闭:

class MongoFactory
{
    public function createMongoDb($id)
    {
        return new MongoId($id);
    }
}

在工厂中,将“新东西”硬编码依赖项视为可以,因为对象的创建是它们的唯一目的,您可以轻松地将它们替换为另一个工厂.

您的消费者类(MyMongo)现在将依赖于MongoFactory(或其接口,如果您愿意),您可以轻松“注入”.

转载注明原文:当构造函数的参数不可用时,PHP依赖注入 - 代码日志