2015-11-10 43 views
0

簡短的版本是,我想註冊一個Unity接口的可能實現,但這些實現可能不可用,具體取決於應用程序配置。Unity中的條件解決?

具體來說,這些是ASP.NET身份(電子郵件,短信等)的雙因素實現。他們的參數在web.config中設置,並且在某些環境中可能無法使用(例如,我們無法從我們的開發筆記本電腦發送電子郵件)。

我想使用ResolveAll來獲取可用的,並且只需註冊適當的InjectionFactories,如果它們不可用,則返回null。但是,這確實會導致調用ResolveAll中的空項目。

基本上,我想要的是相當於在InjectionFactory Func內向Unity發送信號的能力,「沒關係;我實際上無法解決此問題,對不起;不要將我用作註冊源」。

這是可能的

  1. 分裂了從註冊本身 「可以註冊」,所以基本上if (CanRegisterEmailTwoFactor) container.Register<ITwoFactor>("Email", new InjectionFactory(CreateEmailTwoFactor))
  2. 要求所有的ResolveAll調用排除空

注也可能有兩個相互競爭的註冊(例如,內部SMTP vs SendGrid),並且默認行爲將僅返回最後一個所以我也想避免第二個,不可用的用null覆蓋第一個。

+0

你可以使用[空對象模式](https://sourcemaking.com/design_patterns/null_object)嗎? –

+0

不是真的;這些項目會在下拉列表中顯示給用戶。 –

回答

0

直到一個更好的答案出現時,我所做的就是用RegisterInstance取代RegisterType,如下:

private static void ConditionalRegisterInstance<T>(IUnityContainer container, Func<IUnityContainer, T> factory) 
{ 
      T toRegister = factory(container); 
      if (toRegister != null) 
       container.RegisterInstance<T>(toRegister); 
} 

這與兩個因素提供商可以接受的,因爲他們可以重複使用。只要您不介意創建並丟棄「測試實例」,您也可以在測試工廠實際上可以創建項目之後使用RegisterType來對工廠也進行相同的操作。