2015-05-15 64 views
2

我正在註冊像這樣的依賴關係的負載。iisreset後統一註冊失敗

container.RegisterTypes(AllClasses.FromLoadedAssemblies(), 
WithMappings.FromMatchingInterface, 
WithName.Default, 
overwriteExistingMappings: true); 

這注冊的事情很好,web api端點已正確配置。 如果我做iisreset或只是等待一下,然後事情會失敗,

的錯誤信息是不是非常有幫助

"exceptionMessage": "An error occurred when trying to create a controller of type 'ApiController'. Make sure that the controller has a parameterless public constructor.", 

這當然控制器不和不應該有。

我不知道是怎麼回事......但如果我註冊的依賴性明確

container.RegisterType<IDoAThing, Domain.Things.DoAThing>(new HierarchicalLifetimeManager()); 

然後,它所有的作品。

如何獲得'按照約定'註冊以繼續工作?

+0

也許程序集還沒有在Unity註冊開始時被iisreset加載到應用程序域中。嘗試使用['BuildManager.GetReferencedAssemblies']獲取引用的程序集(https://msdn.microsoft.com/en-us/library /system.web.compilation.buildmanager.getreferencedassemblies.aspx)方法來獲取bin文件夾中的程序集列表並將此集合傳遞給AllClasses.FromA ssemblies幫助者方法。最糟糕的情況是,您可以使用每個組件中的知名類,然後在這些程序集中註冊類。 –

+0

看到一個類似的問題,其中程序集尚未加載到應用程序域[例如這裏](http://stackoverflow.com/questions/3552223/asp-net-appdomain-currentdomain-getassemblies-assemblies-missing-after-應用程序) –

+0

我還沒有得到它的工作,但這看起來很可能。如果你讓它成爲答案,我會upvote你甜甜的互聯網點! – Loofer

回答

4

貌似iisreset後,該組件尚未在加載到應用程序域的時候你的統一登記踢。

由於您使用的輔助方法AllClasses.FromLoadedAssemblies(),也不會登記在組件類那還沒有加載。

嘗試獲取帶有BuildManager.GetReferencedAssemblies的引用程序集,它將獲取bin文件夾中的程序集列表。然後使用這些程序集和AllClasses.FromAssemblies輔助方法執行Unity註冊。

.RegisterTypes(
    AllClasses.FromAssemblies(
      BuildManager.GetReferencedAssemblies().Cast<Assembly>()), 
    WithMappings.FromMatchingInterface, 
    WithName.Default, 
    overwriteExistingMappings: true); 

在最壞的情況下,你可以使用從每個組件的類公知的,通過反射獲取其裝配和這個簡化的樣品中使用你註冊爲:

.RegisterTypes(
    AllClasses.FromAssemblies(typeof(Foo).Assembly), 
    WithMappings.FromMatchingInterface, 
    WithName.Default, 
    overwriteExistingMappings: true);