2013-08-22 41 views
0

我想實現:具有單位從配置文件加載的映射,然後在源代碼解決這是從加載的類型說配置文件團結 - loadConfiguration,如何解決只有那些配置

應用。配置

<register type="NameSpace.ITill, ExampleTightCoupled" mapTo="NameSpace.Till, NameSpace" /> 
<register type="NameSpace.IAnalyticLogs, NameSpace" mapTo="NameSpace.AnalyticLogs, NameSpace" /> 

代碼

IUnityContainer container; 
container = new UnityContainer(); 

// Read interface->type mappings from app.config 
container.LoadConfiguration(); 

// Resolve ILogger - this works 
ILogger obj = container.Resolve<ILogger>(); 

// Resolve IBus - this fails 
IBus = container.Resolve<IBus>(); 

問題:有時下iBus將在App.config定義,有時它不會在那裏。當我嘗試解析一個接口/類並且它不存在時,我得到一個異常。

有人可以在這裏教育我嗎?

感謝, 安德魯

您正在使用什麼版本的Unity
+1

防止一起進入這種情況。如果'IBus'是一個可選的依賴項,那麼創建並註冊一個[Null Object Pattern](http://en.wikipedia.org/wiki/Null_Object_pattern)實現(一個空實現,實際上是一個空操作)。這可以防止你不得不復雜化你的應用程序邏輯。 – Steven

回答

3

?在V2 +有一個擴展方法:

public static bool IsRegistered<T>(this IUnityContainer container); 

所以你可以做

if (container.IsRegistered<IBus>()) 
    IBus = container.Resolve<IBus>(); 

擴展方法將使這更好

public static class UnityExtensions 
{ 
    public static T TryResolve<T>(this IUnityContainer container) 
    { 
     if (container.IsRegistered<T>()) 
      return container.Resolve<T>(); 

     return default(T); 
    } 
} 

// TryResolve returns the default type (null in this case) if the type is not configured 
IBus = container.TryResolve<IBus>(); 

還檢查了此鏈接:Is there TryResolve in Unity?

+3

關於「IsRegistered」方法的一個[大警告](https://unity.codeplex.com/discussions/392550):它只是用於調試,因爲它非常慢!它具有O(n)的性能特徵,可以完全淹沒應用程序的性能。 – Steven

+0

TryResolve並不總是返回null - 它將返回類型的默認值(引用類型爲null)。但是,如果解析一個int,例如,0將被返回。此外,與Unity Resolve方法對齊並支持ResolverOverrides以及名稱覆蓋可能會很​​好。 –

+0

是的,我知道它會返回默認類型,我的意思是它會爲IBus返回null。我會更新評論以反映這一點。 – Hack