2013-06-26 117 views
1

我需要注入對象B和C到A,其中對象C被B使用(所有對象都在Autofac中創建)如果不需要B使用C (對象C用於存儲parametrs),我可以使用硬編碼值我可以寫這樣的事:Autofac:注入注入對象(解決dificult依賴關係)

 builder.RegisterType<B>().As<IB>().WithParameter("key","value"); 

但我應該怎麼做,如果parametrs通過autofac產生的?

 builder.RegisterType<B>().As<IB>().WithParameter("key",C.value); 

回答

0

我相信這是你在找什麼

class B 
{ 
    public B(string key, C anotherDependency) 
    { 
     this.Key = key; 
    } 

    public string Key { get; private set; } 
} 

class C 
{ 
    public string Value { get { return "C.Value"; } } 
} 

[TestMethod] 
public void test() 
{ 
    var cb = new ContainerBuilder(); 

    cb.RegisterType<B>().WithParameter(
     (prop, context) => prop.Name == "key", 
     (prop, context) => context.Resolve<C>().Value); 

    cb.RegisterType<C>(); 

    var b = cb.Build().Resolve<B>(); 
    Assert.AreEqual("C.Value", b.Key); 
} 

你可能要考慮的另一種方式是這個

class B 
{ 
    public B(string key) { ... } 

    public B(C c) : this(c.Value) { } 
} 

,這意味着你不需要任何的特殊組合根 - Autofac會自動選擇第二個構造函數(假設C已註冊,而string不是)。