2014-10-21 17 views
6

Denetleyicileri ve yardımcı sınıflarımı bağımlılık enjeksiyonu kullanacak şekilde değiştirdim ve sanırım yardımcı sınıflarım sonsuz bir döngüde sıkışmış durumdayım.Özel sınıflarda bağımlılık enjeksiyonu L4.2'de belirsiz döngüde mi sıkışmış?

Aşağıda, özel ServiceProvider'ım ve iki örnek yardımcı sınıfım var. Gördüğünüz gibi birbirlerini enjekte ederler, böylece ileri geri gitmeye devam ederler.

Bu sorunun çözümü nedir? Ne gibi bir hata yapıyordum?General ve Person gibi yardımcı sınıflar üzerinde testler yürütebilmem için ne yapabilirim?

if (isset($appmade->General)) { 
    // inject the General app that's already instantiated 
} else { 
    $abc = app::make('\Lib\MyOrg\General'); 
    $appmade->General = $abc; 
} 

doğru yolu böyle mi: Ben işe yarayabilir sanırım

bir yolu, aşağıdakileri yapın benim ServiceProvider var?

// /app/providers/myorg/MyOrgServiceProvider.php 

namespace MyOrg\ServiceProvider; 
use Illuminate\Support\ServiceProvider; 
class MyOrgServiceProvider extends ServiceProvider 
{ 
    public function register() 
    { 
     $this->app->bind('\Lib\MyOrg\General', function ($app) { 
      return new \Lib\MyOrg\General(
       $app->make('\Lib\MyOrg\Person'), 
       $app->make('\App\Models\User') 
      ); 
     }); 

     $this->app->bind('\Lib\MyOrg\Person', function ($app) { 
      return new \Lib\MyOrg\Person(
       $app->make('\Lib\MyOrg\General'), 
       $app->make('\App\Models\Device') 
      ); 
     }); 
    } 
} 

// /app/libraries/myorg/general.php 

namespace Lib\MyOrg; 
use App\Models\User; 
use Lib\MyOrg\Person; 
class General 
{ 
    protected $model; 
    protected $class; 

    public function __construct(Person $personclass, User $user) 
    { 
    } 
} 

// /app/libraries/myorg/person.php 

namespace Lib\MyOrg; 
use App\Models\Device; 
use Lib\MyOrg\General; 
class Person 
{ 
    protected $model; 
    protected $class; 

    public function __construct(General $generalclass, Device $device) 
    { 
    } 
} 
+0

Kodun uygun şekilde girildiğini düşünüyor musunuz? – hek2mgl

+0

@ hek2mgl Kodun soruda görüntülenme şeklini mi ima ediyorsunuz? Bana iyi görünüyor ... okunabilirlik önerileriniz varsa lütfen bir düzenleme gönderin. –

+0

@John Bu iyi değil. Hiç iyi değil. Derslerini tekrar gözden geçirmelisin. Dairesel bağımlılıktan kaçının. – brainless

cevap

10

Yardımcınız sınıfları, bağımlılık enjeksiyon ile karıştırıldığında, onları un-örneklenebilir yapmak dairesel bağımlılık durum var ... ve onları çalışmak ve kolaylıkla test edilebilmelidir almak için iyi bir yol yoktur. yardımcı kullanıldığında oldukça daha, bir setter yönteminde bağımlılığın enjekte,

  • Sen setter enjeksiyon kullanabilirsiniz:

    bu işe almak için bazı kesmek-y yolu vardır oluşturulduğunda kurucu . Bu birçok dezavantaja sahiptir, bunlar arasında zayıf olan test edilebilirliği vardır. bağımlılık, bir ya da iki yöntem ile, sadece uygun olup, özellikle

  • laravel 5'te, yöntem enjeksiyon kullanabilir ( http://symfony.com/doc/current/components/dependency_injection/types.html bakınız). Yukarıdaki teklif gibi

  • Bir varlığı kontrol yapabilirdi ( http://mattstauffer.co/blog/laravel-5.0-method-injection bakınız) ya da bir olay dinleyicisiyle şey . Ancak tüm bir döngüsel bağımlılık genellikle tasarım değişikliği sırayla olduğunu gösterir ve en iyi sınıfları birbiriyle nasıl etkileşimde yeniden gözden çözülür

... gerçeğini maskeleme edilir. senin Kişi ve Genel sınıflar birbirlerine tamamen bağımlı olursa

  • ardından bunların tek sorumluluğu paylaşan ve tek sınıfa kombine olmalıdır mümkündür. Ancak birbirlerinin işlevselliği bir alt kümesi güvenmek durumunda

  • , sonra orada bir yerde muhtemelen kendi sorumluluğu gizleme ayrı bir sınıf var ve sonra en iyi çözüm bir ortak işlevselliği ayıklamak olurdu 3. sınıf.Böylelikle, A Sınıfı B Sınıfı'na ve B Sınıfına güvenmek yerine , A Sınıfı A hem de A ve B Sınıfları, C Sınıfı'na güvenir. güvenli bir şekilde hepsini başlatabilir ve hepsi kolayca test edilebilir.

kolayca yeni C sınıfı içermelidir anlamaya nasıl

? Başparmakın büyük bir kuralı http://misko.hevery.com/2008/08/01/circular-dependency-in-constructors-and-dependency-injection/'dan geliyor ... "Sınıf A tarafından kullanılan A sınıfındaki tüm yöntemleri ve sınıf A'nın A sınıfı tarafından kullanılan tüm yöntemlerini listeleyin. İki listenin kısaltması gizli Sınıf C'nizdir. ."

İlgili konular