2009-07-31 19 views
5

AutoFac geçen parametre etrafında başım alınamıyor, aşağıdaki kod çalışmaz:Autofac parametre geçişi ve Autowiring

class Config { 
    public Config(IDictionary<string, string> conf) {} 
} 

class Consumer { 
    public Consumer(Config config) {} 
} 

void Main() 
{ 
    var builder = new Autofac.Builder.ContainerBuilder(); 
    builder.Register<Config>(); 
    builder.Register<Consumer>(); 
    using(var container = builder.Build()){ 
     IDictionary<string,string> parameters = new Dictionary<string,string>(); 
     var consumer = container.Resolve<Consumer>(Autofac.TypedParameter.From(parameters)); 
    } 
} 

atar:

DependencyResolutionException: The component 'UserQuery+Config' has no resolvable constructors. Unsuitable constructors included: 
Void .ctor(System.Collections.Generic.IDictionary`2[System.String,System.String]): parameter 'conf' of type 'System.Collections.Generic.IDictionary`2[System.String,System.String]' is not resolvable. 

ancak aşağıdaki kod

IDictionary<string,string> parameters = new Dictionary<string,string>(); 
var config = container.Resolve<Config>(Autofac.TypedParameter.From(parameters)); 
var consumer = container.Resolve<Consumer>(Autofac.TypedParameter.From(config)); 
+2

Sorunuz çok açık değil. Otofac kullanıcıları olmayanlar için, p, config, TypedParameter.From ve container bildirimlerini gösterebilir misiniz? Ayrıca, ne zaman "işe yaramadığını" belirtin - zaman hatası derleme? İstisna? –

+0

sayılı belgede örnek olarak bir örnek olarak açıklanabilir. LINQPad (referans Autofac.dll) –

cevap

18

:

sadece bu Tüketici için kazandı gidermek çağrısına config parametrelerini geçen sen çözme ediyoruz doğrudan uygulayıcısı hizmeti ile ilişkili Çöz geçirilen parametreler Çalışıyorum bu çevrede yolu için Tüketici kaydını değiştirmektir: bir "okuyunuz zihnim modülü" ile

builder.Register((c, p) => new Consumer(c.Resolve<Config>(p))); 
+0

Şunu mu demek istediniz: builder.Register ((c, p) => yeni Tüketici (c.Resolve (p))); çünkü bu perfetct çalışır! Teşekkürler Nicholas! –

+3

+1 sonunda autofac'ı bilen birisi :-) – galaktor

+4

"Sonunda otofacığı bilen birisi" ile demek istediniz yazar, evet eminim :) – uriDium

0

Autofac besbelli resol çalışıyor: nasıl çalışır ve Config sınıfının parametresinin, sözlüğün kendisinin çözülebilir bir tür olduğu varsayımıyla. Autofac sözdizimini nasıl yapacağımı bilmiyorum. Ancak, Config tipine kayıt yaptırırken muhtemelen daha fazla adım atmanız gerekir, e. g. yeni bir Sözlük içinde geçen bir temsilci vermek. Burada Autofac posta listesinden cevabı tekrarlanması

+0

Haklısınız! ama sonra bir sonraki sorun ortaya çıktığında, aşağıdaki gibi Yapılandırma aşağıdaki gibi kaydedilir: builder.Register ((c, p) => new Config (p.TypedAs >())); p çözme zamanında boş! –

+0

Hm. Belki de autofac'a bir temsilci vermenizdir, ancak delege hala çalışma zamanında Dictionary'e sahip değildir. Temsilcinizde yeni bir Sözlük sağlamayı deneyin, bunun gibi bir şey (farkında olun, hala otofac için kesin tanıma bilmiyorum): builder.Register ((c) => new Config (yeni Sözlük ())); – galaktor

+0

, her zaman Config'e boş bir sözlük vermiyor mu? çözülme zamanında hangi argümanların geçtiğine rağmen? –

0

Maalesef AutoFac gibi IoC konteynerler donatılmış gelmiyor.

Yapmaya çalıştığınız şey temelde "Buradaki türlerden birinin bir sözlük gerektirdiğini biliyorum ve Tüketici türünde bir hizmete ihtiyacım var, lütfen bunun ne olduğunu anlamaya çalışabilir misiniz?" yaklaşık doğru olan?

Tek bir hizmeti çözerseniz ve bir parametre belirlerseniz, söz konusu hizmet için bu parametrenin kullanılmaya çalışılacaktır. Kapsayıcı, bu parametre değerini herhangi bir bağımlılığa yaymaya çalışmaz.

+0

eminim, ilk denemem naif, fakat çıkış yolu değil, eğer parametreler değişmişse kayıtları var mıydı? –

+0

AutoFac daha sonra bunu anlayabilmeli, ancak parametreleri AutoFac ile servis olarak ön kayıt yaptırmanız gerekir. Şahsen ben, yapıcı parametreleri ile hizmet önermiyorum, uygulama ayrıntılarını sızıntıyı kullandığı için sızan bir hizmet olduğundan, hizmeti değiştirmek için daha sonra zorlaştırır. Örnek olarak, bir yapılandırma dosya adını geçeceğiniz bir hizmet olarak düşünün, daha sonra bunun yerine bir veritabanından yapılandırmayı okuyan bir hizmeti kullanmaya karar verirseniz ne olur? –

+0

evet biliyorum, benim çözümüm nokta değil ama şey şu ki, kullanıcının hangi tip Hizmetin kullanılacağını yapılandırabilmesini istiyorum. Ama bu servis aynı zamanda farklı konfigürasyonlara da ihtiyaç duyuyor, bu yüzden bu servis konfigürasyonları IDictionary olarak geçiyor. Daha iyi çözümleri çok isterdim, ama bu fabrika olayı şu ana kadarki en iyi girişimim .. –