2011-03-15 13 views
10

örnekleri:Ninject'i kullanarak, bir arabirimden somut sınıfımı ifşa etmeden bir örnek oluşturabilir miyim? Ben şimdiye kadar bu gibi bakmak gördüğüm

böyle kodunuzu yazın ...

public class Samurai { 
    public IWeapon Weapon { get; private set; } 
    public Samurai(IWeapon weapon) { 
    Weapon = weapon; 
    } 
} 

Ve Ninject böyle somut tipine arayüzü harita ...

public class WarriorModule : NinjectModule { 
    public override void Load() { 
    Bind<IWeapon>().To<Sword>(); 
    } 
} 

Samurai nesnesinde var samurai = kernel.Get<Samurai>(); derken, IWeapon otomatik olarak bir Kılıç'tır.

Sadece ISword istiyorsanız Samurai ve beton kılıç olmadan serin, ama ne

iç olarak işaretlenir ?

Şu anda, ben var sword = DependencyResolver.Current.Resolve<ISword>(); söyleyebiliriz ev yapımı bağımlılık çözücü kullanmak ve bir kılıç ISword olarak dökme beni geri verir. geliştirici bir örneğini oluşturmak için benim bağımlılık özücüyle gitmek gerekir böylece My somut sınıflar iç olarak işaretlenir. Ninject'in buna benzer bir şeyi var mı?

Ve bir bonus soru, ben hiçbir eşleme varsa benim bağımlılık çözümleyici kullanabileceğiniz özel bir "DefaultConcreteType" özelliği ile benim Arayüzleri süsleyin. Ninject'in de böyle bir şeyi var mı?

Teşekkür

cevap

13

Bir beton türüne bir arabirim bağladığınızda, bu arabirimin bir örneğini sorabilir ve beton türünü elde edebilirsiniz.

var sword = kernel.Get<ISword>(); 

Ve bu size somut bir Sword nesneyi verecekti: senin örnekte, bu yapabilirdi. Ayrıca ciltleme sistemi ile çok daha fazlasını yapabilirsiniz. Hatta Bind<ISword>().ToMethod(MySwordFactory); olabilir ve Swords'ı istekte bulunan içeriğe göre almak için bir yöntem yazabilirsiniz.

Yapabileceğiniz başka bir şey, enjekte edilen türe bağlı olarak çalışmaların nasıl ciltleneceğini değiştirmektir.

public class MyClass { 
    [Inject] 
    public ISword Sword { get; set; } 
} 

Ve sonra Sınıfım göre belirli ISword uygulamasına bağlamak olabilir: Örneğin, böylece gibi özel bir sınıfın bir özellik açığa çıkaracak

Bind<ISword>().To<Sword>().WhenInjectedInto<MyClass>(); 

vardır çok daha fazla seçenek ama bu size kaba bir bakış atmalı.

0

Ben ISword s oluşturabilir soyut bir fabrika kullanarak öneriyoruz. Bu, DependencyResolver'a göre bir avantajı vardır, böylece oluşturabileceği türler sınırlıdır (ISword olarak).

Sizin soyut fabrika/ler sadece DependencyResolver gibi kamu olmak gerekir.

0

Bu doğrudan cevap vermez, ama Unity ile biliyorum kodda bağımlılıkları kablolama aksine Yapılandırma dosyalarını kullanarak bunu yapabilirsiniz. Ninject, maalesef Config dosyaları için desteğe sahip değil.

Buna Sizin alternatif olmayan jenerik aşırı yükleri kullanmaktır:

Bind(typeof(IWeapon)).To(typeof(Sword)); 

Ve sonra böyle bir şey yapmak mümkün olmalıdır:

Bind(typeof(IWeapon)).To(Type.GetType("MyNamespace.MyInternalSword")) 

ama eğer fugly büyük var bana sorun ....

İlgili konular