1

ナンシー0.7から0.12にアップグレードしようとすると奇妙な問題が発生します。以前は、ブートストラッパー内のすべてのサービスのログを記録する機能を登録していました。

    protected override void ConfigureApplicationContainer(IWindsorContainer existingContainer)
    {
        existingContainer.AddFacility<LoggingFacility>();
        existingContainer.Register(Component.For<LoggingInterceptor>());
        ...other registration
    }

LoggingFacilityは次のようになります。

public class LoggingFacility : AbstractFacility 
{
    protected override void Init() { Kernel.ComponentRegistered += KernelComponentRegistered; }

    static void KernelComponentRegistered(string key, IHandler handler)
    {
        if (!ShouldProxyComponent(handler))
            return;

        // Don't add more than one logging interceptor to a component
        handler.ComponentModel.Interceptors.AddIfNotInCollection(InterceptorReference.ForType<LoggingInterceptor>());
    }

    static bool ShouldProxyComponent(IHandler handler)
    {
        //Don't log interceptors themselves
        if (typeof(IInterceptor).IsAssignableFrom(handler.ComponentModel.Implementation)) 
            return false;

        //Don't put proxy around any late-bound (usually factory-created) component
        if (handler.ComponentModel.Implementation == typeof(LateBoundComponent))
            return false;

        return true;
    }
}

残念ながら、0.12 / Castle 3.1にアップグレードしてから、次の行でWindsorNancyBootstrapper.RegisterTypes問題が発生しています。

        container.Register(Component.For<Func<IRouteCache>>()
            .UsingFactoryMethod(ctx => (Func<IRouteCache>) (ctx.Resolve<IRouteCache>)));

基本的に、CastleはFuncの周りに動的プロキシを作成しようとします。この登録が私の施設がサブスクライブしたイベントをトリガーした場合、これは問題ありませんが、そうではありません。それでも、インターセプターはとにかく登録されているようです。

MulticastDelgate(Func <>のILの親)が封印されているため、プロキシを作成しようとすると明らかに失敗します。TypeLoadExceptionアセンブリからタイプ'Castle.Proxies.Func`1Proxy'を読み込めませんでした'DynamicProxyGenAssembly2、Version = 0.0.0.0、Culture = neutral 、PublicKeyToken =a621a9e7e5c32e69'親タイプ​​がシールされているため。

ここで何をするのかわかりませんが、FacilitiesとNancy 0.12の経験はありますか?

4

1 に答える 1

1

私にとっての解決策は、Nancy ブートストラップのオーバーライドの一部として Castle TypedFactoryFacility を登録することであることが判明しました。

existingContainer.AddFacility<TypedFactoryFacility>();

残りの変更の一部としてその変更を含む Nancy.Bootstrappers.Windsor へのプル リクエストがあります。

于 2012-10-12T18:49:27.157 に答える