一時的な(または決定的な)解決策...
これが私が問題を解決することができた方法です。
まず、単純な OWIN ミドルウェアを実装しました。
public sealed class WindsorMiddleware : OwinMiddleware
{
public WindsorMiddleware(OwinMiddleware next) : base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
CallContext.LogicalSetData("owinContext", context);
await Next.Invoke(context);
CallContext.FreeNamedDataSlot("owinContext");
}
}
IAuthenticationManager
を使用して構成しComponentRegistration<T>.UseFactoryMethod
たので、次のような拡張メソッドを実装しました。
public static ComponentRegistration<TService> UseOwinComponentFactoryMethod<TService>(this ComponentRegistration<TService> registration)
where TService : class
{
return registration.UsingFactoryMethod
(
(kernel, componentModel, creationContext) =>
{
IOwinContext owinContext = CallContext.LogicalGetData("owinContext") as IOwinContext;
Contract.Assert(owinContext != null);
if (creationContext.RequestedType == typeof(IAuthenticationManager))
{
return (TService)owinContext.Authentication;
}
else
{
throw new NotSupportedException();
}
},
managedExternally: true
);
}
最後に、私はIAuthenticationManager
この方法で登録しました:
Component.For<IAuthenticationManager>().UseOwinComponentFactoryMethod().LifestyleTransient()
臭い...
ところで、このソリューションの信頼性については自信がありません。これは、リクエストしたスレッドとは別のスレッドでコンポーネントを解決しようとしない限り機能するはずだからです。
悲しいことに、このソリューションが失敗する可能性があるのは多くの状況です。あなたのコードが非ブロッキング I/O を実装している場合、IAuthenticationManager
"owinContext" を設定したスレッドから別のスレッドへの注入を試みることを期待していCallContext
ます...
より良い、よりエレガントな解決策を見つけている間、私はまだ他の答えを楽しみにしています.