Asp.net mvc 4 SignalR、WebAPI和MVC共享同一个依赖项解析器内核

Asp.net mvc 4 SignalR、WebAPI和MVC共享同一个依赖项解析器内核,asp.net-mvc-4,dependency-injection,asp.net-web-api,ninject,signalr,Asp.net Mvc 4,Dependency Injection,Asp.net Web Api,Ninject,Signalr,我有一个ASP.NET MVC应用程序,带有SignalR和WebAPI。应用程序使用Ninject进行依赖项注入,但显然signar和WebAPI的内核不同,因此它无法共享所有应用程序都应该共享的单例对象 我可以在日志中清楚地看到,当SignalR收到连接请求时,实例是如何创建的,而当WebAPI收到请求时,实例是如何创建的 我希望在这三个元素之间共享相同的Ninject内核,这样我就可以拥有唯一的单例 这就是我到目前为止所做的: 我做的第一件事是创建一个声明绑定的NinjectModule:

我有一个ASP.NET MVC应用程序,带有SignalRWebAPI。应用程序使用Ninject进行依赖项注入,但显然signar和WebAPI的内核不同,因此它无法共享所有应用程序都应该共享的单例对象

我可以在日志中清楚地看到,当SignalR收到连接请求时,实例是如何创建的,而当WebAPI收到请求时,实例是如何创建的

我希望在这三个元素之间共享相同的Ninject内核,这样我就可以拥有唯一的单例

这就是我到目前为止所做的:

我做的第一件事是创建一个声明绑定的
NinjectModule

public class MyDependencyModule: NinjectModule
{
    public override void Load()
    {
        var binding = Bind<MustBeSingleton>().ToSelf();
        binding.OnActivation((ctx, o) =>
            {
                Debug.Print("Registering item " + o.GetHashCode());
                HostingEnvironment.RegisterObject(o);
            });

        binding.OnDeactivation(o =>
            {
                Debug.Print("Unregistering game connection " + o.GetHashCode());
            });

        binding.InSingletonScope();
    }
}
MVC应用程序使用
NinjectHttpApplication
作为基类,因此我指出必须以这种方式使用的内核:

public class MvcApplication : Ninject.Web.Common.NinjectHttpApplication
{
    protected override Ninject.IKernel CreateKernel()
    {
        return new ApplicationDependencies();
    }
}
此外,在信号器配置中,我指定了解析器:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR<MyPersistentConnection>("/updates", new ConnectionConfiguration()
        {
            Resolver = GlobalHost.DependencyResolver
        });

    }
}
公共类启动
{
公共无效配置(IAppBuilder应用程序)
{
app.MapSignalR(“/updates”,新连接配置()
{
解析程序=GlobalHost.DependencyResolver
});
}
}
(我也尝试过,但没有指定解析器,它也不起作用)

有什么想法吗


干杯。

我在另一篇帖子中找到了答案:

必须使用“ToConstant”而不是作为单例绑定:

var binding = Bind<MustBeSingleton>().ToConstant(new MustBeSingleton());
另一个问题是,Ninject处理我的单身汉是因为我可以识别。我真的不明白为什么会这样,但那是另一场战争


干杯。

为了让这三件事继续运作。。您应该查看以下参考资料:

  • webapi
    +
    Ninject
  • signar
    +
    Ninject
    (最后一部分: 使用ASP.NET MVC时,首先配置SignalR,然后配置ASP.NET MVC)
  • 对于第二个,我进行了一点重构,因为我需要
    signar
    依赖解析程序的内核

    // Route SignalR.
    GlobalHost.DependencyResolver = NinjectWebCommon.GetSignalrResolver();
    RouteTable.Routes.MapHubs();
    
    我在
    NinjectWebCommon
    中定义了
    getSignalResolver
    ,如下所示:

    public static Microsoft.AspNet.SignalR.Ninject.NinjectDependencyResolver GetSignalrResolver()
    {
        return new Microsoft.AspNet.SignalR.Ninject.NinjectDependencyResolver(bootstrapper.Kernel);
    }
    
        public class NinjectDependencyResolver : Microsoft.AspNet.SignalR.DefaultDependencyResolver,
        System.Web.Http.Dependencies.IDependencyResolver
    {
        public readonly IKernel Kernel;
    
        public NinjectDependencyResolver(string moduleFilePattern)
            : base()
        {
            Kernel = new StandardKernel();
            Kernel.Load(moduleFilePattern);
    
        }
        public override object GetService(Type serviceType)
        {
            var service = Kernel.TryGet(serviceType) ?? base.GetService(serviceType);
            return service;
        }
    
        public override IEnumerable<object> GetServices(Type serviceType)
        {
            IEnumerable<object> services = Kernel.GetAll(serviceType).ToList();
            if (services.IsEmpty())
            {
                services = base.GetServices(serviceType) ?? services;
            }
            return services;
        }
    
        public System.Web.Http.Dependencies.IDependencyScope BeginScope()
        {
            return this;
        }
    
        public void Dispose()
        { }
    }
    
    public void Configuration(IAppBuilder app)
    {
        var dependencyResolver = new NinjectDependencyResolver("*.dll");
    
        var httpConfiguration = new HttpConfiguration();
        httpConfiguration.DependencyResolver = dependencyResolver;
        app.UseWebApi(httpConfiguration);
    
        var hubConfig = new HubConfiguration { Resolver = dependencyResolver };
        app.MapSignalR(hubConfig);
    }
    

    注意:有两个不同的
    依赖解析程序
    :一个用于
    Web API
    (1)分配给
    全局配置。配置。依赖解析程序
    ,另一个用于
    信号器
    (2)分配给
    GlobalHost.DependencyResolver

    为了对WebApi和SignalR使用依赖项解析程序,您需要实现如下类:

    public static Microsoft.AspNet.SignalR.Ninject.NinjectDependencyResolver GetSignalrResolver()
    {
        return new Microsoft.AspNet.SignalR.Ninject.NinjectDependencyResolver(bootstrapper.Kernel);
    }
    
        public class NinjectDependencyResolver : Microsoft.AspNet.SignalR.DefaultDependencyResolver,
        System.Web.Http.Dependencies.IDependencyResolver
    {
        public readonly IKernel Kernel;
    
        public NinjectDependencyResolver(string moduleFilePattern)
            : base()
        {
            Kernel = new StandardKernel();
            Kernel.Load(moduleFilePattern);
    
        }
        public override object GetService(Type serviceType)
        {
            var service = Kernel.TryGet(serviceType) ?? base.GetService(serviceType);
            return service;
        }
    
        public override IEnumerable<object> GetServices(Type serviceType)
        {
            IEnumerable<object> services = Kernel.GetAll(serviceType).ToList();
            if (services.IsEmpty())
            {
                services = base.GetServices(serviceType) ?? services;
            }
            return services;
        }
    
        public System.Web.Http.Dependencies.IDependencyScope BeginScope()
        {
            return this;
        }
    
        public void Dispose()
        { }
    }
    
    public void Configuration(IAppBuilder app)
    {
        var dependencyResolver = new NinjectDependencyResolver("*.dll");
    
        var httpConfiguration = new HttpConfiguration();
        httpConfiguration.DependencyResolver = dependencyResolver;
        app.UseWebApi(httpConfiguration);
    
        var hubConfig = new HubConfiguration { Resolver = dependencyResolver };
        app.MapSignalR(hubConfig);
    }
    

    不久前我也遇到过同样的问题,当时我切换到Unity,让Web App/Web API使用相同的解析器内核。我知道你也可以在Ninject中实现这一点,但我发现我不得不使用NinjectMVC3和NinjectWebAPI进行一些黑客攻击。希望这有点帮助!
    public void Configuration(IAppBuilder app)
    {
        var dependencyResolver = new NinjectDependencyResolver("*.dll");
    
        var httpConfiguration = new HttpConfiguration();
        httpConfiguration.DependencyResolver = dependencyResolver;
        app.UseWebApi(httpConfiguration);
    
        var hubConfig = new HubConfiguration { Resolver = dependencyResolver };
        app.MapSignalR(hubConfig);
    }