私は現在、自分自身の依存性注入ソフトウェアを作成していますが、これを行うのが好きだと思っています。DIソフトウェアのコンストラクタまたは取得/設定 - ベストプラクティス
class FactoryDatabase extends PDO
{
public function __construct(
$dsn,$user,$pass
) {
parent::__construct($dsn,$user,$pass);
}
}
class DependencyInjectionContainer
{
protected $Con;
public function __construct(
$db_factory
) {
$this->Con = $db_factory;
}
}
$container = new DependencyInjectionContainer(new FactoryDatabase(....
コンストラクタとどここれを達成するための、あまりにも多くの可能性があるので、セット/ getメソッドを使用する方法を使用する場所、私は完全には理解していないです。
は、より良い練習のために、私は、その優れたが、これらのようなコンストラクタやメソッドを使用する場合は理解したいと思います:
protected $Callbacks;
public function set(
$foo,$bar
) {
if(!empty($this->Callbacks[$foo])) {
$this->Callbacks[$foo] = $bar;
}
}
$container = new DependencyInjectionContainer();
$container->set('db', new FactoryDatabase(......
をしかし、今、私はgetメソッドを作成すると、データベースに直接アクセスできるようになります問題を取得しますオブジェクトはDIコンテナオブジェクトを介してではなく、オブジェクトです。
私は両方のコンストラクタを使用して周りに来て、/ setメソッドを取得する考え:
public function __construct(
FactoryDatabase $db
) {
$this->Con = $db;
}
public function getFunction(
$foo
) {
return $this->Callbacks[$foo]($this);
}
public function getValue(
$foo
) {
return $this->Callbacks[$foo];
}
これは私が値または匿名関数としてコールバックを使用するだけでなく、関数内のメソッドにアクセスする、のようなものすることができます:
$container->set('db_select_members', function($obj){
return $obj->....
});
このベストプラクティスはありますか?または、どのようにしてこのDIソフトウェアを改善して、オブジェクトを他のオブジェクトに不明瞭に保つことができるようにすることができますか?
唯一の問題は、今再びの可能性のオブジェクトへの匿名の機能により直接アクセスが同じようにそこにアクセスされている。
$container->Object
だから、それは時間の無駄ですか?最もceses最高で
作成も意味がありません工場の代替としてのみコンテナを使用n Objectを返し、それを別のオブジェクトに囲んで返します(これはDIではありません)。また、これは状態をベストプラクティスとして使用することはできません。私はすでに私が自分自身を作り出していて、アウトソースを探していないと述べました。私は時間を感謝します。 – KDOT
'$ this-> container-> get( 'db')'をどこから呼び出していますか?なぜなら、私には依存関係の注入よりもむしろサービスロケータのように見えるからです。 – PeeHaa
ちょっと話題にはなりませんが、あなたはどんなプロジェクトにも取り組んでいるのですか? @PeeHaa – KDOT