2012-01-25 17 views
1

他のサービスは、例えばロガー城ウィンザーとWCFのWebアピメッセージハンドラ

ので、私はすべての私のハンドラを登録するインストーラ作成しました(現在は1が存在するのを!)

public class MessageHandlerInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(
      AllTypes 
       .FromThisAssembly() 
       .Where(t => t.IsSubclassOf(typeof (DelegatingHandler))) 
       .Configure(c => c.LifeStyle.Custom(InstallerContext.LifestyleManager)) 
      ); 
    } 
} 

私はを通してそれを実行したときにこれは、正常に動作しますdeb私はコンテナに余分なコンポーネント登録を見ることができます。

しかし、WCF Web API用のメッセージハンドラファクトリを設定しようとすると、動作しないように見えます。 (私は打撃を受けないSendAsyncメソッドにブレークポイントを持っています)

public class MyApiConfiguration : WebApiConfiguration 
{ 
    public MyApiConfiguration(IWindsorContainer container) 
    { 
     EnableTestClient = true; 
     IncludeExceptionDetail = true; 

     CreateInstance = ((serviceType, context, request) => container.Resolve(serviceType)); 
     ErrorHandlers = (handlers, endpoint, description) => handlers.Add(container.Resolve<GlobalErrorHandler>()); 
     MessageHandlerFactory =() => container.ResolveAll<DelegatingHandler>(); 
    } 
} 

私は明らかに何かが不足しています。私はそれが何であるか分かりません。誰でも私を啓発することはできますか?

EDIT(余分な設定コード、要求に応じて)

public void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    AddServiceRoutes(routes); 
} 

private static void AddServiceRoutes(RouteCollection routes) 
{ 
    Container = WindsorContainerBootStrap.CreateContainerAndInstallComponents<PerThreadLifestyleManager>(); 
    var config = new EtailApiConfiguration(Container); 
    routes.MapServiceRoute<CustomersApi>("customer", config); 
    routes.MapServiceRoute<ConsumerApi>("consumer", config); 
    routes.MapServiceRoute<PricePlansApi>("priceplans", config); 
} 

EDIT 2(ソリューション)

私はそうのような私のハンドラのコンストラクタを持っていた...

public MyHandler(DelegatingHandler innerChannel, ILogger logger) 
     : base(innerChannel) 
    { 
     _logger = logger; 
    } 

...ラムダを使用するためにinitコードを変更したにもかかわらず、呼び出されていない...

MessageHandlerFactory =() => container.ResolveAll<DelegatingHandler>(); 

...だから私はちょうど​​を取る別のコンストラクタを追加し、すべてがうまくいきます。私は自分のコンテナが代行ハンドラが何であるか分からず、MessageHandlerFactoryがそれをどうにかして処理しなければならないと考えました。

答えて

1

ctor注入にラムダを使用する必要があります。あなたが欠けている()

あなたはあなたのルートを登録していますか、あなたは設定オブジェクトを渡していますか?

+0

私はそれを試してみます。それが事実ならば、それはresharperのためのFAILです! (それは私が質問に元々あったものに簡略化することができると私に言った) –

+1

あなたはメソッドResolveAllのための "()"がありませんでした。ラムダに関しては、コンパイラはそれをメソッドグループとして補間しますが、それは明らかであるとは言えません。 –

+0

@ GlennBlock、AntonyScott:同じコードを投稿してください –

関連する問題