2014-07-24 52 views
0

我有一個接口「IRunAtStartup」,它在幾個類中實現。該接口有一個方法「Execute」,它需要在應用程序啓動時爲所有類執行。針對Unity容器中相同接口的多個類

在編譯時,我不知道實現接口的類的數量,因此這確實需要以通用的方式編寫。

使用Unity國際奧委會和下面2種方法我都試過2辦法

1)拋出運行時錯誤:

container.RegisterTypes(runAtStartUp, WithMappings.FromAllInterfaces); 

2)拋出一個編譯錯誤 - 在「無法解析型」在for循環中註冊命令。我對統一世界比較陌生,並且懷疑我錯過了這裏的一些基本問題。

IEnumerable<Type> runAtStartUp = typeFinder.FindClassesOfType<IRunAtStartup>(true); 

foreach (var type in runAtStartUp) 
{ 
    container.RegisterType<IRunAtStartup, type>(type.AssemblyQualifiedName); 
} 
foreach (var task in container.ResolveAll<IRunAtStartup>()) 
      { 
       task.Execute(); 
      } 
+0

您可以發佈堆棧跟蹤嗎?方法2對我來說似乎沒問題,其中一種類型可能會遇到問題。 – cynic

+0

方法2甚至沒有編譯。這裏是同樣的截圖:https://dl.dropboxusercontent.com/u/11374665/approach-2.JPG – Vikram

+0

哦。你使用無效的C#語法,錯過了。改爲使用'container.RegisterType(typeof(IRunAtStartup),type,type.AssemblyQualifiedName)'。 – cynic

回答

1

方法2的想法是正確的(使用命名註冊),但是你有一個C#語法錯誤。使用的方法是:

container.RegisterType(typeof(IRunAtStartup), type, type.AssemblyQualifiedName); 
+0

我現在有一個稍微不同的場景,但我懷疑我又犯了一個語法錯誤......你能馬上發現什麼嗎? ** foreach(var settingClass in typeFinder.FindClassesOfType (true)) container.Resolve ()。LoadSetting (「domId」); } ** – Vikram

+0

這裏是一個鏈接截圖。 [鏈接](https://dl.dropboxusercontent.com/u/11374665/LoadSetting.JPG)感謝您的幫助,@cynic – Vikram

+0

您可以在右側創建非通用版本的方法 - 即LoadSettings(輸入settingsType,string domainGuid ...)''。或者你可以使用反射來調用現有的通用版本。您無法像在C#中一樣調用泛型方法 - < >之間的類型名稱在編譯時已知,而不是在運行時已知的「System.Type」實例。 – cynic