2017-03-17 7 views
0

私はこれを包括的な方法で説明することができれば幸いです。 "ライブラリ"オブジェクトがあるとしましょう。この「ライブラリ」には、多くの「ブック」オブジェクトがあり、各「ブック」オブジェクトには「作成者」オブジェクトがあります。このような 何か:Dependencie注入苦闘

class library { 

    private $books = []; 

    public function addBook(book $book){ 
    $this->books[]=$book; 
    } 

    function getAllBookTitles(){ 
    foreach($this->books as $book) 
     $r[] = $book->getTitle(); 
    return $r; 
    } 

} 


class book { 

    private $author; 
    private $title; 

    public function __construct(author $author){ 
    $this->author = $author; 
    } 

    function getTitle(){ 
    return $this->title; 
    } 

    function setTitle($title){ 
    $this->title = $title; 
    } 

} 


class author { 

    public function __construct(){} 

} 

は今、私は本当に理解していないもの: いくつかのビューでは、私が唯一の図書館のすべての本のタイトルのリストが必要な場合は、なぜ著者のオブジェクトを構築する気? これは単なる例ですが、 "author"オブジェクトの作成にはかなり高価でした。イメージは、必要のないデータに対して多くのリソースを使用します。

「著者」をセッターメソッドで注入してオプションにすることができますが、ファクトリを使用して「ブック」オブジェクトを作成したいと思います。

最後に、あなたの工場(またはリポジトリ)にオブジェクトをビルドする必要があるオプションの依存性を伝える最良の方法は何ですか?

私のアプローチは完全に間違っているかもしれません。私の質問はあまり意味がありません。もしそうなら、私は謝罪します。 私は正しい方向に私を得るためにどんな助けも大いに感謝されるでしょう。

+0

'dependazys'が本当に必要なときにのみ作成されるように、'レイジーローディングオブジェクトと依存性注入 'に関する良いテクニックを見つけようとしてください。 – JustOnUnderMillions

+0

ありがとうございます。これは私を助けました。私は少し驚いています。怠惰なローディングと依存性のある注射のために頼むとき、結果はそれほどありません。誰もが興味を持っているトピックではありませんか?それとも、これはとても一般的な慣習ですか、私の理解の欠如は責任を負うことですか? – minychillo

答えて

0

author依存関係のためにの遅延ライフスタイルを使用してください。 bookコンストラクタにauthorオブジェクトを注入する代わりに、authorFactoryを注入します。 authorFactoryは安価に作成でき、必要に応じてauthor個のオブジェクトを作成することができます。また、bookコンストラクタにauthorIdを追加して、必要なときに作成する作者を知る必要があります。あなたのbookオブジェクトがそのauthorプロパティを使用する必要があるときに/場合、それは

if ($this->author == null) 
{ 
    $this->author = $this->authorFactory->createAuthor($this->authorId) 
} 
// Do the rest of your method 

あなたはまた、この使用して閉鎖ではなく、クラスファクトリを行うことができません。

あなたの例では、著者の名前とともに書籍のリストを表示し、ユーザーが書籍の著者をクリックすると著者の詳細を表示すると仮定しています。そのような状況では、ほとんどの場合、作成者の名前が必要になるだけで、作成者の名前をbookのプロパティにすることができ、作成するのが安いでしょう。ユーザーが書籍の著者をクリックすると、遅延読み込みが実行されます。

このメソッドのもう1つの利点は、同じ著者が何度かクリックされたときに毎回データベースにアクセスしないように、何らかの種類の著者キャッシングを実行することです。 authorFactoryの中でそのキャッシュを行い、それをbookに見えないようにすることができます。

+0

ありがとうございました!怠惰な負荷に工場のクラスを注入.... ....もちろん! – minychillo

+0

2つのミニフォローアップ質問: 1)あなたは何をお勧めしますか?閉鎖または工場注入?違いはありますか? 2) "$ this-> authorFactory.createAuthor($ this-> authorId)"はどうですか?私はこの表記法を一点で見たことがありません。それはタイプミスか有効な構文ですか? – minychillo

+0

1)個人的には、作成者オブジェクトを作成することのみを目的とした明確に定義されたファクトリオブジェクトがあれば、ユニットテストが容易になると思うので、私はファクトリを使用します。クロージャーは単体テストを書くときに少し混乱させると思います。しかし、これは私の好みです。工場は私の慣れたものなのかもしれません。 2)はい、それはタイプミスです。私は主にC#プログラマーですので、間違ってその構文を使用しました。 –