2016-12-08 15 views
1

Reflection.Emitを使用して作成された動的生成アセンブリがあります。私は、次のようにウィンザーを使用して、そのアセンブリからコントローラタイプを登録しようとしています:キャッスルウィンザーはダイナミックアセンブリのタイプを登録できますか?

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を使用しない場合(つまり、デフォルトのコントローラーアクティベーターサービスを使用している場合)、アセンブリー/コントローラー/エンドポイントは正しく機能します。 Reflection.Emitの代わりにWindsorのDynamicProxy機能を使用することもできますが、私はこの難しい課題に取り組む前に、この現行のアプローチですべての可能性を尽くしたいと思います!

答えて

4

いいえ、あなたは何も欠けていません。現在のところ、これはWindsorによってサポートされていません。

Classes.FromAssembly(myDynamicAssembly)ウィンザーはAssembly.GetExportedTypesを使用して登録するタイプを検索し、the documentationの状態は動的アセンブリではサポートされていません。

ウィンザーは、デフォルトではパブリッククラスのみを登録できるため、非公開クラスを見るのに時間を浪費する必要がないように、3232を使用します。

ただし、を使用しない. IncludeNonPublicTypes()を追加して例外を無効にすることができ、例外の発生を停止します。その副作用は、今、ウィンザーは指定された基準(BasedOn<ApiController>())を満たす潜在的な非公開クラスを登録することになりますので、それらをフィルタリングする必要がないようにしてください。

ご登録はどのように見えるか:

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

私はウィンザーは、箱から出して、動的アセンブリを扱うべきではない理由を正当な理由がないと思うので、おそらくあなたはそれのために問題を開いて、で亀裂を持っているしたいのですがプルをリクエストしていますか?

関連する問題