SignalR在使用StructureMap依赖关系解析程序时无法调用客户端函数

本文关键字:程序 调用 函数 客户端 StructureMap 关系 依赖 SignalR | 更新日期: 2023-09-27 18:30:09

当我在global.asax for signalR中包含一个结构映射依赖解析程序时,对客户端函数的任何调用都不再到达浏览器,尽管我可以在日志管道中看到它们。

以下是我的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);
    }
}

以下是StructureMapRegistry的实现(还有更多包含应用程序集的实现)。

[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-感谢所有能抽出时间看一看的人。

SignalR在使用StructureMap依赖关系解析程序时无法调用客户端函数

在Jeremy Miller的一些诚实建议之后,我们改用了AutoFac,它运行得很好。