5

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 を構成に渡すことができます。

4

1 に答える 1

7

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

以下を試してください:

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;
        }
    }

アプリをブートストラップするときに、カスタム ハブ アクティベーターを登録します (おそらく global.asax)。

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

signalR dependencyResolver を再度構成するよりも、はるかに単純なソリューションです。

于 2013-11-04T17:24:15.550 に答える