cevap

20

new MyClass() numaralı telefonu ararsanız, StructureMap hiç kullanılmaz. StructureMap yapılandırmasının hiçbir miktarı davranışı değiştirmez.

ObjectFactory.GetInstance<MyClass>() numaralı telefonu ararsanız, StructureMap varsayılan olarak kurucuyu daha fazla parametre ile çağırır.

Eğer StructureMap farklı kurucusunu kullanmak istiyorsanız, (PHeiberg cevabı ile) yapıcısı belirtebilirsiniz:

x.SelectConstructor<IMyClass>(() => new MyClass(null)); 

Ya da sadece Use() aşırı yüklenmesini kullanarak örneğini nasıl oluşturulacağı açıkça StructureMap söyleyebilirim kabul eden bir Func<>: Joshua cevabı tüm yönlerini kapsayan

x.For<IMyClass>().Use(ctx => new MyClass(ctx.GetInstance<IMyService>())) 
+0

2 parametresi olan bir MyClass kurucusunu kullanmak istersam ne olur? 'ctx.GetInstance <>' yalnızca 1 tip parametresine izin verir. –

5

. Eğer SelectContructor yöntemini kullanabilirsiniz Yuşa örnekte yapıldığı gibi kurucusuna argümanları hardcoding olmadan belirli bir yapıcı seçmek için StructureMap yapılandırmak amacıyla bir yan not olarak:

x.SelectConstructor<MyService>(() => new MyService()); 

SelectConstructor yöntem çağrısında lambda çağırmak gerekir Gerekli kurucu (mevcut tüm parametreler için null veya herhangi bir doğru değer koymak). Daha fazla bilgi için bkz. the documentation.

0

Yapılandırma arayüzü gibi DI kapsayıcı kullanırken, her sınıfta yalnızca tek bir kurucunun olması en iyisidir. Eğer IMyService bir bağımlılık ise (eğer biraz garip görünüyorsa) bu yapıcı, sınıfın tüm bağımlılıklarını çözmelidir. Bu, parametrelenmemiş kurucunun gerekli olmaması için her zaman çözülmelidir.

+0

Üzgünüz, şimdi düzelttim. CMyService yerine, kullanıcı CMyClass'ım var. Teşekkürler. –

İlgili konular