2016-12-08 100 views
1

我有一個使用Reflection.Emit創建的動態生成的程序集。然後我試圖從以下列方式使用溫莎該程序集註冊的控制器類型:可以從動態程序集中Castle Castle Windsor註冊類型?

WindsorContainer.Register(Classes.FromAssembly(myDynamicAssembly).BasedOn<ApiController>().LifestylePerWebRequest());

當我嘗試導航到這些控制器我得到以下錯誤的一個指定端點:

[NotSupportedException: The invoked member is not supported in a dynamic assembly.] 
System.Reflection.Emit.InternalAssemblyBuilder.GetExportedTypes() +68 
Castle.Core.Internal.ReflectionUtil.GetAvailableTypes(Assembly assembly, Boolean includeNonExported) +74 
Castle.MicroKernel.Registration.FromAssemblyDescriptor.&lt;SelectedTypes&gt;b__0(Assembly a) +21 
System.Linq.&lt;SelectManyIterator&gt;d__14`2.MoveNext() +267 
Castle.MicroKernel.Registration.FromDescriptor.Castle.MicroKernel.Registration.IRegistration.Register(IKernelInternal kernel) +296 
Castle.MicroKernel.DefaultKernel.Register(IRegistration[] registrations) +72 
Castle.Windsor.WindsorContainer.Register(IRegistration[] registrations) +50 

難道只有在動態程序集中無法註冊任何東西,或者是否有其他一些缺失的問題?

請注意,如果沒有Windsor(即使用默認的控制器激活器服務),程序集/控制器/端點工作正常。我可以使用Windsor的DynamicProxy功能而不是Reflection.Emit方法,但是我想在解決這個有點令人頭疼的任務之前用這種當前的方法排除所有可能性!

回答

4

不,你不會錯過任何東西。目前這不受溫莎的支持。

由於堆棧跟蹤指示,您在何處Classes.FromAssembly(myDynamicAssembly) Windsor使用Assembly.GetExportedTypes來查找要註冊的類型,並且如the documentation所述,此方法在動態程序集上不受支持。

Windsor使用GetExportedTypes無需浪費時間查看非公共類,因爲它默認只允許公共類註冊。

但是,您可以通過添加. IncludeNonPublicTypes()而不使用Assembly.GetExportedTypes來覆蓋它,並會停止發生異常。這樣做的副作用是,現在溫莎將會註冊任何符合您指定標準的潛在非公開課程(BasedOn<ApiController>(),所以如果您想避免這樣做,您將不得不自己過濾掉這些課程)

因此,爲了完整性,您的註冊將如何看:

container.Register(
    Classes.FromAssembly(myDynamicAssembly) 
     .IncludeNonPublicTypes() 
     .BasedOn<ApiController>() 
     .LifestylePerWebRequest()); 

我想沒有好的理由溫莎不應處理動態組件開箱即用,所以也許你想開一個問題,它和有裂紋的拉請求它?