c# - Asp.Net SignalR DependencyResolver 不解析集线器

标签 c# asp.net asp.net-mvc asp.net-mvc-4 signalr

我们有一个复杂的应用程序,其集线器分布在多个 dll 中。完整的应用程序使用 DI 和 LightCore。现在我们面临的问题是 SignalR 似乎没有使用我们编写的 DependencyResolver Adapter。

我们尝试了两种不同的方式来注入(inject)我们自定义的 IDependencyResolver:

GlobalHost.DependencyResolver = new LightCoreSignalRDependencyResolver();

var hc = new HubConfiguration(Resolver = new LightCoreSignalRDependencyResolver()); 
app.MapSignalR(hc);

在这两种情况下,我们的解析器都不会在创建集线器时被调用。更糟糕的是,我们得到的异常是集线器没有无参数构造函数。

我们还做了一个简短的测试,只是将自定义 IHubActivator 注入(inject)到 DefaultDependencyResolver 中。同样的结果。根本没有使用 HubActivator - 至少我们没有遇到断点和日志条目。

有人知道这里会出什么问题吗?

(在 MVC 和 WebApi 中,自定义依赖解析器按预期工作)

集线器使用构建器助手进行注册:

builder.Register<Hubs.LoggingHub, Hubs.LoggingHub>();

依赖解析器看起来像这样:

public class LightCoreSignalRDependencyResolver : DefaultDependencyResolver
{
    private readonly IContainer _container;

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

    public object GetService(Type serviceType)
    {
        try
        {
            return _container.Resolve(serviceType);
        }
        // IDependencyResolver implementations must not throw an exception 
        // but return null if type is not registered
        catch (RegistrationNotFoundException registrationNotFoundException)
        {
            return base.GetService(serviceType);
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return  _container.ResolveAll(serviceType).Concat(base.GetServices(serviceType));
        }
        // IDependencyResolver implementations must not throw an exception 
        // but return an empty object collection if type is not registered
        catch (RegistrationNotFoundException registrationNotFoundException)
        {
            return base.GetServices(serviceType);
        }
    }
}

集线器构造函数如下所示:

这个与默认解析器一起使用,并使用我们的内部 Bootstrap 来解析依赖项。 (丑陋但有效的方式 - 表明可以解决依赖关系)

    public RobotControlHub()
    {
        _Publisher = Booty.Container.Resolve<IPublisher>();
        _MessageService = Booty.Container.Resolve<IRobotMessageRepectionService>();
        _CommandsService = Booty.Container.Resolve<IRobotGenericCommandsService>();
        _ConnectionsMapping = Booty.Container.Resolve<IRobotConnectionMappingRepository>();
    }

这就是我们在 SignalR 中使用解析器时期望调用的构造函数。

    public RobotControlHub(
        IRobotConnectionMappingRepository connectionsMapping, 
        IRobotGenericCommandsService commandsService,
        IRobotMessageRepectionService messageService,
        IPublisher publisher)
    {
        _Publisher = publisher;
        _MessageService = messageService;
        _CommandsService = commandsService;
        _ConnectionsMapping = connectionsMapping;
    }

但正如所说,它似乎甚至没有被调用。

最佳答案

有时候睡一觉忘记这个问题是件好事。第二天早上,您查看代码,发现缺少“覆盖”。 正确代码:

public class LightCoreSignalRDependencyResolver : DefaultDependencyResolver
{
    private readonly IContainer _container;

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

    public **override** object GetService(Type serviceType)
    {
        try
        {
            return _container.Resolve(serviceType);
        }
        // IDependencyResolver implementations must not throw an exception 
        // but return null if type is not registered
        catch (RegistrationNotFoundException registrationNotFoundException)
        {
            return base.GetService(serviceType);
        }
    }

    public **override** IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return  _container.ResolveAll(serviceType).Concat(base.GetServices(serviceType));
        }
        // IDependencyResolver implementations must not throw an exception 
        // but return an empty object collection if type is not registered
        catch (RegistrationNotFoundException registrationNotFoundException)
        {
            return base.GetServices(serviceType);
        }
    }
}

关于c# - Asp.Net SignalR DependencyResolver 不解析集线器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30172849/

相关文章:

c# - ContentView Xamarin 表单

asp.net <%$ ... %> 语法

asp.net - 如果发送的 HTTP 请求具有 "Access-Control-Allow-Origin",我如何在 Fiddler 中查看

c# - "run text"标记在 XAML 中意味着什么?

c# - 安装向导中的数据库连接

c# - 实例化一个知道公共(public)​​基类的泛型类型

.net - .NET 中属性的限制值

c# - 如何使用 twitter api 获取 twitter 用户的电子邮件地址

asp.net-mvc - 将参数传递给 Telerik asp.net mvc 网格

c# - 如何获取列表中值的列总计 - 匿名类型的 double