1

我有一個奇怪的問題,試圖從南希0.7升級到0.12。以前我是註冊機構爲我的我的引導程序中的所有服務做記錄:城堡溫莎設施不與南希溫莎Bootstrapper很好玩

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 /城堡3.1,在WindsorNancyBootstrapper.RegisterTypes以下行導致一些問題

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

基本上,Castle試圖圍繞Func創建一個動態代理。如果此註冊觸發了我的設施訂閱的事件,那麼這樣可以,但事實並非如此。但攔截器似乎無論如何都是註冊的。

當試圖創建它顯然失敗的代理因爲MulticastDelgate(IL的父爲函數功能<>)被密封: TypeLoadException 未能加載從組件類型「Castle.Proxies.Func`1Proxy」「DynamicProxyGenAssembly2,版本= 0.0 .0.0,Culture = neutral,PublicKeyToken = a621a9e7e5c32e69',因爲父類型是密封的。

我不確定這裏有什麼,沒有人有設施和南希0.12的任何經驗嗎?

回答

1

對我來說,解決方案竟然是註冊城堡TypedFactoryFacility作爲我的南希引導程序的重寫的一部分:

existingContainer.AddFacility<TypedFactoryFacility>(); 

有一個pull request到Nancy.Bootstrappers.Windsor一個包括變化部分其餘的變化