2016-06-24 11 views
1

私は現在、自分自身の依存性注入ソフトウェアを作成していますが、これを行うのが好きだと思っています。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最高で

答えて

-2

がテストとsymfonyジのようなLIBSを使用する準備ができて使用することです(http://symfony.com/doc/current/components/dependency_injection/introduction.html

あなたが本当にあなた自身の最高の使用を記述する必要がある場合は、

のように取得-ERSを持つクラスを作成することですhttps://justpaste.it/vlpm

など

+0

作成も意味がありません工場の代替としてのみコンテナを使用n Objectを返し、それを別のオブジェクトに囲んで返します(これはDIではありません)。また、これは状態をベストプラクティスとして使用することはできません。私はすでに私が自分自身を作り出していて、アウトソースを探していないと述べました。私は時間を感謝します。 – KDOT

+1

'$ this-> container-> get( 'db')'をどこから呼び出していますか?なぜなら、私には依存関係の注入よりもむしろサービスロケータのように見えるからです。 – PeeHaa

+0

ちょっと話題にはなりませんが、あなたはどんなプロジェクトにも取り組んでいるのですか? @PeeHaa – KDOT

関連する問題