SignalR 2.0使用Ninject注入接口

 Dr-xuan_484 发布于 2023-02-08 14:53

我有以下简单的Hub类来列出使用注入用户服务的用户.使用NinjectSignalRDependencyResolver的启动类.非常简单的客户端脚本.

[HubName("dashboardHub")]
public class DashboardHub : Hub
{
    private readonly IUserService _users;

    public DashboardHub(IUserService users)
    {
        _users = users;
    }

    public void Initialize()
    {
        var users = _users.ListUsers();

        Clients.All.UpdateStatus(users);
    }
}

startup.cs

  var kernel = new StandardKernel();
  var resolver = new NinjectSignalRDependencyResolver(kernel);

  var config = new HubConfiguration()
  {
        Resolver = resolver,
  };

  app.MapSignalR(config);

NinjectSignalRDependencyResolver

public class NinjectSignalRDependencyResolver : DefaultDependencyResolver
{
    private readonly IKernel _kernel;

    public NinjectSignalRDependencyResolver(IKernel kernel)
    {
        _kernel = kernel;
    }

    public override object GetService(Type serviceType)
    {
        return _kernel.TryGet(serviceType) ?? base.GetService(serviceType);
    }

    public override IEnumerable GetServices(Type serviceType)
    {
        return _kernel.GetAll(serviceType).Concat(base.GetServices(serviceType));
    }
}


JavaScript的


我在RegisterServices内以标准方式注册Ninject接口

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind().To().InSingletonScope();

    ...
}

用脚本打开客户端时.代码运行,没有生成异常或脚本错误.永远不会调用Dashboard的构造函数,也不会调用Initialize()方法 - 即使JavaScript中存在对象,方法也是如此.永远不会将用户列表填充为client.updateStatus永远不会被调用.

如果我向Hub类添加一个默认构造函数,那么调用它也是如此,而Initialize方法也是如此 - 但是当私有IUserService变量为null时,它显然会被忽略.

public DashboardHub()
{
}

如何配置SignalR 2.0和Ninject以允许集线器具有依赖注入的构造函数参数?

1 个回答
  • 实现这一目标的最简单方法是完全摆脱Custom Dependency解析器,而只使用一个非常简单的IHubActivator.

    startup.cs

    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR();
    }
    

    Hubactivator.cs

    public class HubActivator : IHubActivator
    {
        private readonly IKernel container;
    
        public HubActivator(IKernel container)
        {
            this.container = container;
        }
    
        public IHub Create(HubDescriptor descriptor)
        {
            return (IHub)container.GetInstance(descriptor.HubType);
        }
    }
    

    RegisterServices

    private static void RegisterServices(IKernel kernel)
    {
        GlobalHost.DependencyResolver.Register(typeof(IHubActivator), () => new HubActivator(kernel));    
    
        kernel.Bind<IUserService >().To<UserService>().InSingletonScope();
    
        ...
    }
    

    很简单 - 一切正常,接口被注入到构造函数中,正如您所期望的那样......

    2023-02-08 14:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有