2012-06-27 112 views
0

如果我有在相同的接口類型一類兩個屬性,我想注入兩種不同類型的conrete每個我怎麼做,與autofac或者與屬性或構造注入。Autofac兩個屬性與同類型

例如。

class A : IA 
{ 
    public IB PropertyB { get; set; } 
    public IB PropertyC { get; set; } 

    public A(IB b, IB c) 
    { 
     PropertyB = b; 
     PropertyC = c; 
    } 

    public void PrintB() 
    { 
     PropertyB.Print(); 
    } 

    public void PrintC() 
    { 
     PropertyC.Print(); 
    } 
} 

我已經試過,但當然,我只是得到一個C注入到這兩個屬性

var builder = new ContainerBuilder(); 

    builder.RegisterType<B>().As<IB>(); 
    builder.RegisterType<C>().As<IB>(); 
    builder.RegisterType<A>().As<IA>(); 

    var container = builder.Build(); 
    var a = container.Resolve<IA>(); 

或者這具有相同的結果:

builder.RegisterType<B>().As<IB>(); 
    builder.RegisterType<C>().As<IB>(); 
    builder.RegisterType<A>().As<IA>().PropertiesAutowired(); 

    var container = builder.Build(); 
    var a = container.Resolve<IA>(); 

有沒有一種方法,我可以告訴autofac我想PropertyB中的B和PropertyC中的C?

回答

2

使用屬性注入,你可以做到以下幾點:

builder.RegisterType<A>() 
    .As<IA>() 
    .OnActivating(e => 
{ 
    e.Instance.PropertyB = e.Context.Resolve<BImpl1>(); 
    e.Instance.PropertyC = e.Context.Resolve<BImpl2>(); 
}); 
+0

嗨感謝您的解決方案,但是當我嘗試這個,我得到一個ComponentNotRegisteredException錯誤時autofac試圖解決B或C contrete類型。 –

+0

您必須使用Autofac明確註冊具體類型。 – Steven