6
numaralı özeti

Birlik kabından çözdüğü bazı bağımlılıkları olan bir sınıf yazdım. benim ana sınıfından itibaren Birlik kayıt örneği ve

benim Birlik Konteyner

UContainer.RegisterInstance<MyObject>(myObject, new ExternallyControlledLifetimeManager()); 

ile kayıt

MyObject myObject = new MyObject(); 

yeni bir nesne oluşturmak bir bağımlılık

ConsumerObject consumer = new ConsumerObject(); 
olarak bu ihtiyacı türünü oluşturmak

Tüketici şunu beğendi:

bağımlılık

Çözünürlük başarısız = "MyObject" tipi, adı = "":

public class ConsumerObject 
{ 
    public ConsumberObject() 
    { 
     theObject = (MyObject)UContainer.Resolve(typeof(MyObject));  
    } 
} 

bu bir istisna atar. Özel durum iletisi: Geçerli yapı işlemi (yapı anahtarı Oluşturma Anahtarı [MyObject, null]) başarısız oldu: Kurucu MyObject (IPreferenceStorageProvider pp) çağrılırken pp parametresi çözümlenemedi. (Strateji türü BuildPlanStrategy, dizin 3)

Çözünürlüğüm neden türü üzerinde başka bir çalışmacı aramaya çalışıyor?

Teşekkür

Bildiğim kadarıyla Birlik (varsayılan olarak) çalışır bildiği gibi

cevap

1

aramaya .. herhangi bir fark yaratmak için görünmüyor theObject = UContainer.Resolve<MyObject>();: Ben zaten oluşturulmuş ve ben de böyle denedim .. örneği kayıtlı En fazla sayıda parametreye sahip kurucu ve parametrelerin her birini eşleştirmeden çözmeye çalışır. IPreferenceStorageProvider için eşleme eklediniz veya bu parametreyi gerektiren yapıcıyı kaldırdınız.

IPreferenceStorageProvider parametresinin birleşim tarafından enjekte edilmesini istemiyorsanız, belki de yapıcı parametresi olarak bildirilmemelidir. Bu nesnenin varsayılan kod kurucusunda sabit kod örneği olabilir.

+2

sorun "MyObject" benim nesne .. O .. Bunu oluşturabilir, ancak ben onun yapısı üzerinde hiçbir kontrole sahip yaklaşık 15 oluşturucusu yok olmasıdır .. Neden Birlik, her halükarda yeniyi yapmaya çalışıyor mu? Bir örnek oluşturdum ve kaydettim .. Şu anda konteynırda bir singleton var, herhangi bir kurucu çağırmamalı .. ??? –

3

Neden yaptığınız davranışları gördüğünüzden emin değilim. Senaryoyu çoğaltan bir test oluşturdum ve iyi çalıştı.

, böyle bir şey denedik

public class ConsumerObject 
{ 
    public ConsumberObject(MyObject myObject) 
    { 
     theObject = myObject 
    } 
} 

ve sonra UContainer.Resolve<MyObject>() kullanarakSTART_BREAKYönetici?

Düşünebildiğim tek şey, UContainer.RegisterInstance ve daha sonra UContainer.Resolve'a eriştiğinizde iki farklı kapsayıcıya erişiyor olmanızdır. UContainer'ı nasıl beyan ettiğinizi bize gösterebilir misiniz?

6

Sorun şu ki, ExternallyControlledLifetimeManager'ı kullanmanızdır. Bu durumda Birlik kabı, örneğinize yalnızca zayıf referansı tutar. Çözmeyi denediğinizde, örneğiniz zaten çöp topladı. Bu nedenle .RegisterInstance() için varsayılan LifeTimeManager, ContainerControlledLifeTimeManager'dır. Ve Darrel Miller'ın durumu işe yarıyor, çünkü henüz GC-ed değil. senin örneği bu şekilde kayıt deneyin:

UContainer.RegisterInstance<MyObject>(myObject);