2013-10-22 36 views
0

我有以下方法:團結集裝箱和ContainerControlledLifetimeManager當服務接口陣列

public void RegisterPlugin<T1>() where T1 : IWebrolePlugin 
{ 
    try 
    { 
     _container.RegisterType<T1>(new ContainerControlledLifetimeManager()); 
     _container.RegisterType<IWebrolePlugin, T1>(typeof(T1).Name,new ContainerControlledLifetimeManager()); 

    }catch(Exception e) 
    { 
     Trace.TraceError(e.ToString()); 
    } 
} 

我的問題是,當我做_container.Resolve()我得到預期SomePlugin相同的實例,但使用時下面的注入構造函數會解析新的實例。

我有下列註冊也:

_container.RegisterType<WebsiteManager>(new InjectionConstructor(typeof(IDirectoryManager), typeof(IStore), typeof(IWebrolePlugin[]))); 

我的問題是IWebrolePlugin陣列[]是新的實例。我可以做任何這樣的我的方法

public T GetPlugin<T>() where T : IWebrolePlugin 
{ 
    return _container.Resolve<T>(); 
} 

將返回WebsiteManager在其構造函數中得到的相同的實例嗎?

回答

1

解析時,Unity首先按照名稱將接口映射到具體類型,並將具體類型和名稱用作BuildKey。此BuildKey用於構建和注入依賴關係的各個方面(包括查找生命期管理器)。這就是爲什麼默認註冊(空名稱)和相同類型的命名註冊會導致返回不同的實例。

使用相同的情況下,最簡單的方法是在界面和具體類型之間對準的註冊名:

public void RegisterPlugin<T1>() where T1 : IWebrolePlugin 
{ 
    try 
    { 
     _container.RegisterType<T1>(typeof(T1).Name, 
      new ContainerControlledLifetimeManager()); 
     _container.RegisterType<IWebrolePlugin, T1>(typeof(T1).Name); 
    } 
    catch (Exception e) 
    { 
     Trace.TraceError(e.ToString()); 
    } 
} 

public T GetPlugin<T>() where T : IWebrolePlugin 
{ 
    return _container.Resolve<T>(typeof(T).Name); 
} 

這將導致相同的情況下返回了直決心和作爲的一部分ResolveAll(針對數組)。