2012-06-17 106 views
2

在我的MVC項目的web.config,我有這樣的:爲什麼我無法從其他程序集加載類?

<appSettings> 
    <add key="MembershipRepository" value="Repo.MembershipRepository"/> 
</appSettings> 

我有這樣的代碼:

var appSettings = ConfigurationManager.AppSettings; 
string membershipRepositoryClassName = appSettings["MembershipRepository"]; 
Type membershipRepositoryType = Type.GetType(membershipRepositoryClassName); 
IMembershipRepository repository = (IMembershipRepository)Activator.CreateInstance(membershipRepositoryType); 

假設,包含web.config Web應用程序是用匯編Web。 我給出的代碼段是彙編Lib。 類MembershipRepository在組裝RepoWeb提及LibRepoLib沒有引用任何其他程序集(它可能被引用爲dll)。 Repo可能會或可能不會參考Lib。我得到membershipRepositoryTypenull。我明白,也許我需要指定MembershipRepository所在的程序集。一種方法是在配置中指定程序集名稱(如this)。但我認爲應該有其他方法。否則,如何加載其他類只從配置文件中創建類名? 例如,MembershipProvider類從其他程序集加載得很好。

我該怎麼辦。或者如果我不能,爲什麼我不能?

+1

故障排除提示:將'true'傳遞給'Type.GetType'''Type.GetType(membershipRepositoryClassName,true)''''''這樣你就得到了一個描述問題的詳細異常。 –

回答

2

從MSDN庫文檔Type.GetType(String)

的typeName:類型的程序集限定名稱來獲得。見AssemblyQualifiedName。如果該類型位於當前正在執行的程序集或Mscorlib.dll中,則只需提供由其名稱空間限定的類型名即可。

這最後一句解釋說,當你只指定類名,爲什麼有時工作原理:如果執行代碼是在Repo,那麼你可以只用指定MembershipProvider脫身。但我建議爲了清晰(也是性能),避免此行爲並始終指定程序集名稱。或者,如果您已經參考了包含您的類型的Assembly,則可以改爲撥打Assembly.GetType

不過,如果你真的有這樣一個場景,你不知道哪個部件包含你的類型,那麼你可以搜索在當前的AppDomain所有加載的程序集,並嘗試在每一個呼叫Assembly.GetType

Type type = AppDomain.CurrentDomain.GetAssemblies() 
    .Select(assembly => assembly.GetType(typeName)) 
    .First(t => t != null); 
+0

謝謝,這解釋了一切。我應該在配置中指定程序集。當然,從所有程序集中獲取_most probable_類型並不是一個好主意。我只是想實現**爲什麼我需要指定程序集時,其他人不需要**。現在我意識到,我以前的一些配置只是幸運地工作! – Mohayemin

+0

重新檢查配置,如果程序集在當前項目中被引用,它看起來像我不需要指定程序集。是這樣嗎? – Mohayemin

+0

據我所知,不,事實並非如此。例如,即使您的項目可能引用System.dll,「Type.GetType(」System.Uri「)將始終返回null。 –

1

你要找什麼是這樣的:

var types = AppDomain.CurrentDomain.GetAssemblies().ToList() 
    .SelectMany(s => s.GetTypes()) 
    .Where(p => p.Name == membershipRepositoryClassName); 

,實際上是要返回一個列表,因爲具有相同名稱的類型可能在不止一個組件來聲明。如果您確定只有一種類型,則可以在鏈的末尾添加.FirstOrDefault().Single()。如果您不確定該類型是否存在,並且希望在不存在的情況下返回null,請使用.FirstOrDefault()。如果您確定該類型應該存在並且希望它在未找到類型時引發異常,請使用.Single()

相關問題