2013-12-20 59 views
2

在Global.asax中的的Application_Start我有以下你如何解決signalR V2.0與StructureMap V2.6

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

我對集線器接口是

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」信號和JavaScrip pt顯示值。如果我只是刪除解析器,那麼signalR不再找到無參數的構造函數,並且Initialize方法不會被調用。

如果我包括StructureMap依賴解析器(這是工作,現在注入周圍其他40個班),然後我得到以下異常消息

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 

另外,如果我嘗試只是解決這一切啓動。 CS,像這樣:

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

    app.MapSignalR(); 
} 

我也得到同樣的錯誤。

有沒有人能夠解決這個問題?

回答

9

最簡單的方法是使用HubActivator

所有你在啓動時需要的,CS是

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

爲您的集線器建立一個激活

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代碼,因爲它不需要...

+0

現貨和一個更清潔的解決方案,然後他在asp.net SignalR示例中給出的。 –

+1

拯救生命,謝謝! –