2013-12-11 6 views
7

http://www.asp.net/signalr/overview/signalr-20/extensibility/dependency-injectionこのNinjectコードに相当するAutofacは何ですか?次のページで

底部近くには、(単なるテキスト「RegisterHubs.Start」の下に)私はAutofacを使用して再現しようとしていますNinjectコードの一部があります。

これまでのところ、私は自分に頭痛を与えるのに成功しましたが、あまり多くはありませんでした。私はAutofac wikiとウェブをいくつか助けにしました。しかし、私はたぶん情報の一部を見逃していたと確信しています。

更新:ページに関連するNinjectコードがあります。

public static class RegisterHubs 
{ 
    public static void Start() 
    { 
     var kernel = new StandardKernel(); 
     var resolver = new NinjectSignalRDependencyResolver(kernel); 

     kernel.Bind<IStockTicker>() 
      .To<Microsoft.AspNet.SignalR.StockTicker.StockTicker>() 
      .InSingletonScope(); 

     kernel.Bind<IHubConnectionContext>().ToMethod(context => 
       resolver.Resolve<IConnectionManager>(). 
        GetHubContext<StockTickerHub>().Clients 
      ).WhenInjectedInto<IStockTicker>(); 

     var config = new HubConfiguration() 
     { 
      Resolver = resolver 
     }; 

     App.MapSignalR(config); 
    } 
} 

アップデート2:私も構成されしようとしているオブジェクトを追加するだろうと思いました。

public class StockTickerHub : Hub 
{ 
    private readonly IStockTicker _stockTicker; 

    public StockTickerHub(IStockTicker stockTicker) { } 
} 

public class StockTicker 
{ 
    public StockTicker(IHubConnectionContext clients) { } 
} 
+0

記事には2つの 'RegisterHubs.Start'があります。あなたはどこで立ち往生しますか?あなたのコードを投稿してください。 – Win

+0

あなたはそれを稼働させることができましたか? IConnectionManagerを取得するために 'GlobalHost'を使いましたか? –

答えて

11

autofacにはWhenInjectedIntoメソッドと同等の機能がありません。ただし、名前付きのパラメータを使用して同じ処理を実行できます。 AutofacDependencyResolverAutofac.Integration.SignalRから来ている:

注この

using Autofac.Integration.SignalR; 
using Microsoft.AspNet.SignalR.StockTicker; 

public static class RegisterHubs 
{ 
    public static void Start() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterType<StockTicker>() 
      .WithParameter(ResolvedParameter.ForNamed("StockTickerContext")) 
      .As<IStockTicker>() 
      .SingleInstance(); 

     builder.Register(c => GlobalHost.DependencyResolver.Resolve<IConnectionManager>().GetHubContext<StockTickerHub>().Clients) 
      .Named<IHubConnectionContext>("StockTickerContext"); 

     var container = builder.Build(); 

     var resolver = new AutofacDependencyResolver(container); 

     var config = new HubConfiguration { Resolver = resolver }; 

     App.MapSignalR(config); 
    } 
} 

のようなものを試してみてください。

更新:ああ、私はリンクされたページから小さなディテールを見逃しました。 IHubConnectionContextのファクトリ関数は、リゾルバを使用して、IConnectionManagerを取得していますが、コンテナ自体は(もちろん、コンテナはIConnectionManagerについては認識しません)。代わりにデフォルトの依存関係リゾルバ(GlobalHost.DependencyResolver)を使用して、IConnectionManagerを取得しました。それはうまくいくはずです。

+0

お返事ありがとうございます。私はそれを与え、トリックを行うかもしれないと思った。しかし、いずれのクラスのコンストラクタにも当てはまらない。私は別のものを試し続け、私がそれを理解できるかどうかを見ます。 – Obscured

+0

そして、あなたはSignalRが正しくマッピングされていることを確信しています。 '/ signalr/hubs'ルートにたどり着くとどうなりますか? – khellang

+0

申し訳ありません。はい、私はこれをDIなしで実行していました。私はちょうど運動としてDIに切り替えたいと思っていました。それは私が始まっている方法かもしれない?私はシグナルスタートアップクラスでこれを持っていました。 global.asax/app_startへの移行が助けになるかどうかがわかります。 – Obscured

関連する問題