SignalR结构图依赖项解析器(为Microsoft.AspNet.SignalR.Messaging.IMessageBus指定)

Abd*_*GIN 3 structuremap signalr

我该如何解决这个错误?

版本

Microsoft.AspNet.SignalR.Core 2.2.0,structuremap 3.1.4.143

global.asax signalR依赖解析

// SIGNALR DEPENDENCY RESOLVER
        GlobalHost.DependencyResolver = new StructureMapSignalRDependencyResolver(Container ?? ObjectFactory.Container);
Run Code Online (Sandbox Code Playgroud)

StructureMapSignalRDependencyResolver

public class StructureMapSignalRDependencyResolver : DefaultDependencyResolver
{
    private readonly IContainer _container;
    public StructureMapSignalRDependencyResolver(IContainer container)
    {
        _container = container;
    }

    public override object GetService(Type serviceType)
    {
        object service = null;
        //Below is a key difference between this StructureMap example, GetInstance is used for concrete classes.
        if (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass)
        {
            //If the type is a concrete type we get here...
            service = _container.GetInstance(serviceType);
        }
        else
        {
            // Non concrete resolution which uses the base dependency resolver if needed.
            service = _container.TryGetInstance(serviceType) ?? base.GetService(serviceType);
        }
        return service;
    }

    public override IEnumerable<object> GetServices(Type serviceType)
    {
        var objects = _container.GetAllInstances(serviceType).Cast<object>();
        return objects.Concat(base.GetServices(serviceType));
    }
}
Run Code Online (Sandbox Code Playgroud)

erorr

没有注册默认实例,无法自动确定类型为"Microsoft.AspNet.SignalR.Messaging.IMessageBus"

没有为Microsoft.AspNet.SignalR.Messaging.IMessageBus指定配置

1.)新AckSubscriber(IMessageBus的默认,IAckHandler的默认)2.)3. Microsoft.AspNet.SignalR.Infrastructure.AckSubscriber)Microsoft.AspNet.SignalR.Infrastructure.AckSubscriber 4.)Container.GetInstance(的实例Microsoft.AspNet .SignalR.Infrastructure.AckSubscriber)

在此输入图像描述

在此输入图像描述

小智 5

首先尝试从基类解析.

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

        var service = base.GetService(serviceType);
        if (service != null) return service;

        return (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass)
            ? container.GetInstance(serviceType)
            : container.TryGetInstance(serviceType);
    }
Run Code Online (Sandbox Code Playgroud)