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