2013-07-25 149 views
0
public interface A 
{ 
} 
public interface B 
{ 
} 
public interface C : A, B 
{ 
} 
public class Foo : C 
{ 
} 
     IUnityContainer unity = new UnityContainer(); 
     unity.RegisterType<A, Foo>(new TransientLifetimeManager(), new InjectionFactory(container => { throw new Exception(); })); 
     unity.RegisterType<B, Foo>(new TransientLifetimeManager(), new InjectionFactory(container => { throw new Exception(); })); 
     unity.Resolve<A>(); //uses RegisterType<B, Foo> InjectionFactory 

我期望Unity使用「A」InjectionFactory。當類註冊多個接口時,Unity解決上次註冊

+0

有趣的,我會說這是一個錯誤,或至少不按預期工作。使用命名註冊似乎可以解決問題,但這可能不是您想要的。 –

回答

3

Unity只爲每個構建密鑰維護一個構建計劃,因此第二個註冊將覆蓋第一個註冊(對於Foo)。

註冊時,首先在A和Foo之間創建映射,然後基於構建密鑰(Type:Foo,Name:null)將任​​何注入成員應用於目標類型(Foo)。

因此,A與Foo之間的映射與應用於Foo的注入成員是分開的。

爲了更清楚地說明了註冊的覆蓋,我認爲以下是功能上等同於您的配置:

unity.RegisterType<Foo>(new TransientLifetimeManager(), 
    new InjectionFactory(container => { throw new Exception(); })); 

unity.RegisterType<Foo>(new TransientLifetimeManager(), 
    new InjectionFactory(container => { throw new Exception(); })); 

unity.RegisterType<A, Foo>(); 

在一般情況下,如果你需要不同的注入裝置應用於同一具體類型,那麼你將需要使用指定的註冊。