2016-04-13 50 views
0

kullanarak Strateji deseni oluşturarak Bu benim dependancy enjeksiyon kurgusunda:Döngüsel bağımlılık hatası olduğunda Ninject

dIcontainer.Bind<DBContext>().ToSelf().InRequestScope(); 

//Repository accepts a constructor parameter DBContext 
dIcontainer.Bind<IRepository1, Repository1>(); 
dIcontainer.Bind<IRepository2, Repository2>(); 

//All strategies accepts a constructor parameter of a repository interface 
//There is one strategy per repository 
dIcontainer.Bind(x => x.FromThisAssembly().SelectAllClasses().InheritedFrom<IStrategy>().BindSingleInterface()); 

//The factory accepts a constructor parameter of IEnumerable<IStrategy> 
dIcontainer.Bind<StrategyFactory>().ToSelf(); 

fabrikanın uygulanması:

public class StrategyFactory 
{ 
    private IEnumerable<IStrategy> _strategies; 

    public StrategyFactory(IEnumerable<IStrategy> strategies) 
    { 
     _strategies = strategies; 
    } 

    public IStrategy GetStrategy(string keyToMatch) 
    { 
     return _strategies.Single(strategy => strategy.IsStrategyMatch(keyToMatch)); 
    } 
} 

depoları ve bağlam ayrı projede bulunmaktadır.

Ben GetStrategy yöntemi (DI ağacı çözme) bu hatası alıyorum aradığında: Bunun yerine, her strateji kurucularınızdaki depoları kadar yeni olursa

Error activating IStrategy using binding from IStrategy to Strategy1 A cyclical dependency was detected between the constructors of two services.

:

public Strategy1() 
{ 
    _repository = new Repository1(new DBContext());   
} 

alıyorum fabrikamdaki mükemmel stratejiler listesi ve keyToMatch'i temel alarak ilgili stratejiyi çözebilir. Neyi yanlış yapıyorum?

Sorunun çok küçük olup olmadığını bana bildirin.

Strategy1 needs Repository1 needs Foobar needs Strategy1 needs (and on and on and on, sorry but there's not enough disk space in the world to finish this example properly)

Yani bir StackoverflowException yılında sona ereceğini bu çözme, bkz:

cevap

0

Sikluslü bir Bağımlılık gibi bir şey anlamına gelir. çözümleyici Sen döngüsü belirlemek ve bunu kırmak gerekiyor için ...

Foobar için Strategy1 için Repository1 için Foobar için Strategy1 çözme döngülerinde açacak. Ya gerçekten gerçekten kırıyorsunuz, aksi halde bir bileşeninin InSingletonScope() veya InRequestScope() (uygulanabilir olduğu gibi) bir kapsam kullanması ve onu caka içine enjekte etmek yerine tembel enjekte etmesini sağlayabilirsiniz. Bunun için Ninject.Extensions.Factory ve Lazy<T> veya Func<T> kullanabilirsiniz.

+0

Teşekkürler. Cevabınız benim problemimi çözmedi, ama beni doğru yöne yönlendirdi. Sorun gerçekten kapsamlarıydı. Görünüşe göre benim içeriğim InRequestScope() idi ve hiçbiri benim depolarım hiçbir kapsamda değildi. Bunları InRequestScope() 'a değiştirdikten sonra çalışır. Stratejilerin hala kapsam dahilinde olması gerekmemektedir, ancak sanırım bu, depolarla ve bağlamın ayrı bir projede olmasıyla ilgilidir. – danskov

İlgili konular