0

signalR の global.asax に構造マップの依存関係リゾルバーを含めると、クライアント関数への呼び出しがブラウザーに到達しなくなりますが、ログ パイプラインにある場合は確認できます。

これが私の global.asax の抜粋です。

var container = ObjectFactory.Container;

// Now configure SignalR, MVC, ASP.Net and SharpRepository

GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule());
GlobalHost.HubPipeline.AddModule(new LoggingPipelineModule());

// TODO: Work out why this breaks the connection between the server and the client.

GlobalHost.DependencyResolver = 
    ObjectFactory.GetInstance<IDependencyResolver>();
RouteTable.Routes.MapHubs();

DependencyResolver.SetResolver(
    new StructureMapDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = 
    new StructureMapDependencyResolver(container);
RepositoryDependencyResolver.SetDependencyResolver(
    new SharpRepository.Ioc.StructureMap.StructureMapDependencyResolver(container));

ここでは、構造マップ リゾルバーの実装を示します。

public class StructureMapSignalRDependencyResolver 
    : DefaultDependencyResolver
{
    private readonly IContainer _container;

    public StructureMapSignalRDependencyResolver(
        IContainer container)
    {
        if (container == null)
        {
            throw new ArgumentNullException("container");
        }

        _container = container;
    }

    public override object GetService(Type serviceType)
    {
        object result = null;

        try
        {
            result = 
                !serviceType.IsAbstract &&
                !serviceType.IsInterface &&
                serviceType.IsClass
                    ? _container.GetInstance(serviceType)
                    : (_container.TryGetInstance(serviceType) 
                        ?? base.GetService(serviceType));
        }
        catch (Exception ex)
        {
            Tracing.Error(
                "[StructureMapSignalRDependencyResolver]",
                 Tracing.SerializeException(ex));
        }

        if (result == null)
        {
            Tracing.Information(
                "[StructureMapSignalRDependencyResolver]",
                "Could retrieve object of type {0}",serviceType.ToString());
        }

        return result;
    }

    public override IEnumerable<object> GetServices(
        Type serviceType)
    {
        IEnumerable<object> result = null;

        try
        {
            result = _container.GetAllInstances(serviceType)
                .Cast<object>().Concat(
                    base.GetServices(serviceType));
        }
        catch (Exception ex)
        {
            Tracing.Error(
                "[StructureMapSignalRDependencyResolver]", 
                Tracing.SerializeException(ex));
        }

        if (result == null)
        {
            Tracing.Information(
                "[StructureMapSignalRDependencyResolver]", 
                "Could retrieve object of type {0}", serviceType.ToString());
        }

        return result;
    }

    public override void Register(Type serviceType, 
        Func<object> activator)
    {
        Tracing.Information(
            "[StructureMapSignalRDependencyResolver]", 
            "Registering object of type {0}", 
            serviceType.ToString());

        base.Register(serviceType, activator);
    }

    public override void Register(Type serviceType, 
        IEnumerable<Func<object>> activators)
    {
        Tracing.Information(
            "[StructureMapSignalRDependencyResolver]", 
            "Registering object of type {0}", 
            serviceType.ToString());

        base.Register(serviceType, activators);
    }
}

ここに StructureMap Registry の実装があります (アプリケーション アセンブリを含むものは他にもたくさんあります)。

[RegistryOrder(Order = 6)]
public class SignalRRegistry : Registry
{
    public SignalRRegistry()
    {
        For<IDependencyResolver>().Singleton()
            .Use<StructureMapSignalRDependencyResolver>();
        For<IHubConnectionContext>().Singleton()
            .Use(GlobalHost.ConnectionManager
                .GetHubContext<BOSSHub>().Clients);     
    }

    //public void Configure()
    //{
    //    GlobalHost.DependencyResolver = 
    //        ObjectFactory.GetInstance<IDependencyResolver>();
    //    RouteTable.Routes.MapHubs();
    //}
}

依存関係がなくなるように、Hub クラスをロールバックしました。WhatDoIHave からの出力には、Microsoft.AspNet.SignalR のエントリがいくつかあるようですが、具体的な関係はありません。

レジストリのステップを見逃したのではないでしょうか? どこにも例外はありません。global.asax から GlobalHost.DependencyResolver 行をコメントアウトすると、機能しなくなります。

誰かが彼らのために働いているsignalRのDI実装を私と共有してくれることを願っています.

どうもありがとう

更新: 不適切な書式設定を整理していただきありがとうございます - 感謝します。

更新: 問題を示す小さなテスト プロジェクトをまとめました。正直に言うと、私が取り組んでいるアプリケーションとしてそれを再現できたことに驚きました。かなり大規模で複雑で、多くの StructureMap が進行中です。私は GitHub にアップロードしました: https://github.com/johnk27stars/SignalRTest.git - 時間を割いて見てくれた人に感謝します。

4

1 に答える 1