5

SignalR 2.0で既存のIoCを使用するにはどうすればよいですか?SignalR 2.0で既存のIoCコンテナを使用する

チュートリアルから、私がセットアップに属性を経由してOWINから呼び出されるクラスを必要とするようだ:

using Microsoft.Owin; 
using Owin; 
[assembly: OwinStartup(typeof(SignalRChat.Startup))] 
namespace SignalRChat 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app /*HOW AM I GONNA GET UNITY CONTAINER HERE?*/) 
     { 
      var hubConfig = new HubConfiguration() 
      { 
       EnableJSONP = true, 
       EnableDetailedErrors = true, 
       EnableJavaScriptProxies = true, 
       Resolver = new SignalRUnityDependencyResolver(container) 
      }; 


      // Any connection or hub wire up and configuration should go here 
      app.MapSignalR(hubConfig); 
     } 
    } 
} 

ここでの問題は、私はすでにコンテナを持っていることであるが、ブートストラップさだとシングルトンがあります同じホストの下で共有されているMVCアプリと共有する必要のあるコンテナ内のインスタンス。

しかし、ここでのトラブルは、以前のように、私自身のコードからMapSignalRメソッドを呼び出すことができないように見えます。むしろ私はこれを行うためにOWINに頼る必要があります。しかし、OWINは私が既にセットアップしたコンテナを認識していません。

これを解決するにはどうすればよいですか?私はいくつかのものを保持するために静的変数を使用して一緒にソリューションをハックする方法をいくつかの非常に粗末なアイデアを持って - しかし、私は非常にそれの考えが嫌い。コードは脆く、操作の順序によって微妙なバグが簡単に発生する可能性があります。

OWINで上記のメソッドを呼び出さずにIAppBuilderインスタンスを保持する方法はありますか?こうすることで、SignalRが初期化され、自分のIoCをコンフィギュレーションに渡すことができます。

+0

これは奇妙です。 SignalR 2.0以前は、ASP.NETはGlobal.asaxをあなたのために呼び、そこにルートを登録しました。これはほぼ同じことです。 – davidfowl

答えて

7

私のケースでは、アプリケーション全体とシグナルRの間に共有コンテナを使用するカスタムハブアクチベータを作成しました(コンストラクタインジェクションによって)。

すると、次の方法を試してください。

public class CustomHubActivator : IHubActivator 
    { 
     private readonly Container _container; 

     public MseHubActivator(Container container) 
     { 
      _container = container; 
     } 

     public IHub Create(HubDescriptor descriptor) 
     { 
      return _container.GetInstance(descriptor.HubType) as IHub; 
     } 
    } 

you'reがはるかにsimplierソリューションthat'sではなくにアプリ(多分Global.asaxの)

GlobalHost.DependencyResolver.Register(typeof (IHubActivator), 
                () => new CustomHubActivator(Container)); 

をブートストラップ時にカスタムハブ活性化因子を登録しますもう一度signalR dependencyResolverを設定してください

関連する問題