可以从动态组件中的温莎城堡寄存器类型



i具有使用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

是不可能在动态组件中注册任何东西,还是我缺少其他问题?

请注意,如果没有温莎(即使用默认控制器激活器服务)汇编/控制器/端点正常工作。我可以使用温莎的动态二氧化功能而不是反射。

nope,您不会错过任何东西。目前,这不受温莎的支持。

正如堆栈跟踪所示的那样,您在哪里进行Classes.FromAssembly(myDynamicAssembly) Windsor使用Assembly.GetExportedTypes来寻找要注册的类型,并且如文档所述,此方法不支持动态组件。

温莎使用GetExportedTypes不必浪费时间看非公共类,因为默认情况下它仅允许注册公共类。

但是,您可以通过添加不使用Assembly.GetExportedTypes. IncludeNonPublicTypes()来覆盖它,并且会阻止异常发生。副作用是,现在温莎将注册满足您指定条件的任何潜在的非公共类(BasedOn<ApiController>(),因此,如果您想避免,您必须自己过滤掉这些标准。

因此,对于完整性,您的注册方式是:

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

我猜没有有充分的理由为什么温莎不应该从开箱即用的动态组件来处理动态组件,所以也许您想打开一个问题并在请求时打破裂缝?

最新更新