【问题标题】:Using Ninject with SignalR in MVC4在 MVC4 中使用 Ninject 和 SignalR
【发布时间】:2012-11-22 15:20:38
【问题描述】:

我刚刚开始在我们的 MVC 4 项目中探索 SignalR。我想做的一件事是将 Ninject DI 添加到我们的 Hub 类中。两个问题:

1) 我找到并安装了 SignalR.Ninject,但是这样做之后,我不太确定我用它做什么。我尝试将以下行添加到 AppStart NinjectWebCommon 文件中的 RegisterServices() 方法中,但这会产生编译错误。

private static void RegisterServices(IKernel kernel)
{
    kernel.Load(
        new Repositories.AssetModule()
    );

    GlobalHost.DependencyResolver = new
        SignalR.Ninject.NinjectDependencyResolver(kernel);
}

2) 正确配置后,是否可以对 Hub 类使用构造函数注入,还是需要对 [Inject] 属性使用属性注入?

任何方向都将不胜感激。

【问题讨论】:

  • 这里有同样的问题

标签: asp.net-mvc asp.net-mvc-4 ninject signalr


【解决方案1】:

我也一直在为以下编译错误而苦恼:

GlobalHost.DependencyResolver = new
        SignalR.Ninject.NinjectDependencyResolver(kernel);

但是,我设法通过将 NinjectDependencyResolver 的内容复制到一个新类来解决它:

public class NinjectSignalRDependencyResolver : DefaultDependencyResolver
    {
        private readonly IKernel _kernel;

        public NinjectSignalRDependencyResolver(IKernel kernel) 
        {
            if (kernel == null)
            {
                throw new ArgumentNullException("kernel");
            }

            _kernel = kernel;
        }

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

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

然后我在类 NinjectWebCommon(由 SignalR nuget 提供)的 RegisterServices 方法中设置解析器,如下所示:

private static void RegisterServices(IKernel kernel)
{            
   RouteTable.Routes.MapHubs(new NinjectSignalRDependencyResolver(kernel));
}

【讨论】:

  • 谢谢托拜厄斯,非常好的修复。
  • 我收到此错误:无法从“SignalR.NinjectSignalRDependencyResolver”转换为“Microsoft.AspNet.SignalR.HubConfiguration”
  • 我觉得这个答案很奇怪,MapHubs 没有像 'DependencyResolver' 这样的重载!!!
  • @Colton 我假设您使用的是较新版本的 SignalR。
【解决方案2】:

我遵循了@TobiasNilsson 的回答,但出现了这个错误:无法从“SignalR.NinjectSignalRDependencyResolver”转换为“Microsoft.AspNet.SignalR.HubConfiguration”

private static void RegisterServices(IKernel kernel)
{
    GlobalHost.DependencyResolver = new NinjectSignalRDependencyResolver(kernel);
}       

然后在哪里:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapHubs();//SignalR
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    相关资源
    最近更新 更多