2016-12-08 6 views
1

У меня есть динамически сгенерированная сборка, которая была создана с использованием Reflection.Emit. Я тогда пытаюсь зарегистрировать типы контроллеров с этой сборкой, используя Виндзор следующим образом:Can 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 (т.е. с использованием службы активатора контроллера по умолчанию) сборка/контроллеры/конечные точки работают правильно. Я могу использовать функциональность DynamicProxy от Windsor вместо подхода Reflection.Emit, но я хотел бы исчерпать все возможности с помощью этого текущего подхода, прежде чем я займусь этой непростой задачей!

ответ

4

Нет, вам ничего не хватает. В настоящее время это не поддерживается Виндзором.

Как трассировки стека указывает, где вы Classes.FromAssembly(myDynamicAssembly) Виндзор использует Assembly.GetExportedTypes искать типы регистрировать и в the documentation состояний, этот метод не поддерживается на динамических сборок.

Windsor использует GetExportedTypes, чтобы не тратить время на изучение непубличных классов, поскольку по умолчанию разрешают публичные классы регистрироваться.

Однако вы можете переопределить его, добавив . IncludeNonPublicTypes(), который не использует Assembly.GetExportedTypes и остановит исключение. Побочным эффектом этого является то, что теперь Windsor зарегистрирует любые потенциальные непубличные классы, соответствующие вашим заданным критериям (BasedOn<ApiController>(), поэтому, если вы хотите этого избежать, вам придется отфильтровать их самостоятельно.

Так что для полноты, здесь как ваша регистрация будет выглядеть:

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

Я предполагаю, что нет никаких причин, почему Виндзор не должен обрабатывать динамические сборки из коробки, так что, возможно, вы хотели бы, чтобы открыть вопрос для него и есть трещины на тянуть, требуя его?