如何使用StructureMap v2.6解析signalR v2.0

在Global.asax的Application_Start中,我有以下内容

ObjectFactory.Initialize(cfg => { cfg.For().Singleton().Add (); }); 

我的Hub接口是

 public interface IDashboardHub { void Initialize(); } 

我的中心如下:

 public class DashboardHub : Hub, IDashboardHub { private readonly ICpeAccountService _accountService; public DashboardHub(ICpeAccountService service) { _accountService = service; } [Authorize] public void Initialize() { Clients.All.UpdateStatus("Hello World!!!"); } } 

如果我删除注入的构造函数和解析器,那么我得到“Hello World”信号,JavaScript显示值。 如果我只是删除解析器,那么signalR不再找到无参数构造函数,并且不会调用Initialize方法。

如果我包含StructureMap依赖项解析器(它正在工作并立即注入大约40个其他类),那么我得到以下exception消息

 StructureMap configuration failures: Error: 104 Source: Registry: StructureMap.Configuration.DSL.Registry, StructureMap, Version=2.6.4.0, Culture=neutral, PublicKeyToken=e60ad81abae3c223 Type Instance '87da3c00-4deb-4334-b189-021d445d95ec' (Configured Instance of App.DependencyResolution.StructureMapDependencyResolver, App, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null) Cannot be plugged into type Microsoft.AspNet.SignalR.IDependencyResolver, Microsoft.AspNet.SignalR.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 

此外,如果我尝试在startup.cs中解决所有问题,如下所示:

 public void Configuration(IAppBuilder app) { ObjectFactory.Initialize(cfg => { cfg.For() .Singleton() .Add(); }); app.MapSignalR(); } 

我也得到了同样的错误。

有没有人能够解决这个问题?

最简单的方法是使用HubActivator

启动时你需要的只是cs

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

为您的集线器创建一个Activator

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

确保在app_start中注册此激活器

 IContainer container = StructureMap.Container(); // Register a Hub Activator for SignalR GlobalHost.DependencyResolver.Register(typeof(IHubActivator), () => new HubActivator(container)); 

然后删除任何SignalRDependencyResolver代码,因为它不需要…