2016-12-08 36 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()); 

我想没有好的理由温莎不应处理动态组件开箱即用,所以也许你想开一个问题,它和有裂纹的拉请求它?