2010-09-18 19 views
5

Ninject'e oldukça yeni geldim, ancak bir özel sağlayıcı kullanarak DI için kullanmayı başarılı bir şekilde kullandım.Ninject, Providers and Activator.CreateInstance

kernel = new StandardKernel(); 

kernel.Bind<IPatientRecordLocator>().ToProvider<PatientRecordLocatorProvider>(); 

şöyle

bağlama başlatıldığını ve özel sağlayıcısı evet, ben vb hiçbir hata işleme olduğunu farkındayım (şimdiye

protected override IPatientRecordLocator CreateInstance(IContext context) 
{ 
    var name = ConfigurationManager.AppSettings["PatientRecordLocator"]; 
    var typeName = name.Split(',')[0]; 
    var assemblyName = name.Split(',')[1]; 
    return Activator.CreateInstance(assemblyName, typeName).Unwrap() as IPatientRecordLocator; 
} 

gibi Activator.CreateInstance diyoruz Yukarıdaki kodda :))

ve bunların hepsi bir çekicilik gibi çalışır.

Şimdi, karşı karşıya olduğum sorun, IPatientRecordLocator örneklerine enjekte etmek istediğim yeni bir sınıf tanıttığım zamandı. Aşağıdaki gibi bir kurucu eklediğimde sorun oluşur. Activator.CreateInstance I çalışması için bu sınıfların birinin

[Inject] 
public MockPatientRecordLocator (IContactAdapter contactAdapter) 
{ 
    ... 
} 

Sonra da Dolayısıyla yani sınıf MockPatientRecordLocator için

public MockPatientRecordLocator() 
{ 
} 

parametresiz yapıcı eklemek zorunda, sorum şu: nasıl Ninject yapabilirsiniz IContactAdapter'ı uygulayan bir sınıf örneğini ör. MockPatientRecordLocator? Yöntem enjeksiyonu denedim, ama boşuna.

Elde etmeye çalıştığım şeyin, bir tür PatientRecordSummary örneğinin bir MockPatientRecordLocator örneğiyle (yapıcı enjeksiyonu kullanarak) enjekte edildiği ve MockPatientRecordLocator'ın söz konusu örneğinin bir enjektörle enjekte edilmesi gerektiği bir tür zincirleme enjeksiyon olduğunu açıklamayı unuttum. IContactAdapter örneği (yine kurucu enjeksiyonu (eğer mümkünse)). Zincirin ilk kısmı işe yarıyor, ikincisi yok.

cevap

1

İlk soru için fena değil!

Size Load() kod bağlamında statik olarak kullanılabilir yok şeyler kaydına izin vermektir Bind(Type) aşırı kullanmak isteyen

- Eğer sağlayıcısı yapıyoruz şeyler yapmak kadar ön (yani Type çözme) . Bu, Ninject'in nesne örneğini (varsayılan bir .ctor için herhangi bir gereksinim olmaksızın)

IIRC two or 3 of my most recent answers da yapmasına izin verir, ayrıca bu keşif/yükleme öğelerine de dokunup, sizin durumunuzla ilgili olması gereken örneklere sahip olur.

(Ve alışkanlık şeyler kaldırmak geldiysen [Inject] nitelikler başvurmak gerekir)

+0

Merhaba Ruben, Yardımlarınız (ve iltifat) için teşekkürler. En iyisini yapmaya çalışıyorum :-) Bu özel kurulumda modülleri kullanmadım, ama bunları kullanmaya geçeceğim, böylece daha kolay Bind() kullanabilirim. – norgie