Can Castle Windsor可以从动态装配中注册类型吗?

时间:2016-12-08 11:19:40

标签: c# castle-windsor

我有一个使用Reflection.Emit创建的动态生成的程序集。然后我尝试使用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方法,但在我解决这个有点令人生畏的任务之前,我想用这个当前的方法耗尽所有可能性!

1 个答案:

答案 0 :(得分:4)

不,你没有遗漏任何东西。目前Windsor不支持此。

当堆栈跟踪指示时,Classes.FromAssembly(myDynamicAssembly) Windsor使用Assembly.GetExportedTypes查找要注册的类型和the documentation状态,动态程序集不支持此方法。 / p>

Windsor使用GetExportedTypes不必浪费时间查看非公共类,因为它默认只允许公共类注册。

但是,您可以通过添加不使用. IncludeNonPublicTypes()的{​​{1}}来覆盖它,并停止发生异常。其副作用是,现在Windsor将注册任何符合您指定条件的潜在非公开课程(Assembly.GetExportedTypes,因此如果您想避免这种情况,您必须自行过滤这些课程。

因此,为了完整起见,请注意以下内容:

BasedOn<ApiController>()

我想没有充分的理由说明为什么温莎不应该开箱即可处理动态组件,所以也许你想为它打开一个问题并且有拉动请求它?