2014-01-08 31 views
3

我有一個使用SignalR和依賴注入框架的MVC 4應用程序。因此,我需要實現一個自定義的DependencyResolver。爲了連接它,我使用的是無法在HubConfiguration中將DependencyResolver傳遞給MapSignalR

 var resolver = new CustomSignalRDependencyResolver(...); 
     GlobalHost.DependencyResolver = resolver; 
     app.MapSignalR(); 

並且一切按預期工作。但是,如果我用一個HubConfiguration對象是這樣的:

 var resolver = new CustomSignalRDependencyResolver(...); 
     app.MapSignalR(new HubConfiguration(
      { 
       Resolver = resolver 
      }); 

一切似乎工作(該對象已正確連接式,沒有任何錯誤或警告任何),但遠程方法不再被調用。有人可以解釋第一種和第二種方法之間的區別嗎?

+2

http://stackoverflow.com/a/20202040/2001735 –

+1

如果您設置自定義解析程序,則不需要設置全局解析程序*您不能*將全局主機用於* anything *。 – davidfowl

+1

@LarsHöppner的回答是正確的。 – davidfowl

回答

5

我認爲LarsHöppner(留下對此貼的第一條評論的用戶)是正確的。

您可以絕對使用自定義的依賴關係解析器而不會更改GlobalHost.DependencyResolver(SignalR測試套件經常這樣做),但是您必須確保GlobalHost不會出現在代碼的其他任何地方。

這意味着,絕對沒有引用:

  • GlobalHost.Configuration
  • GlobalHost.ConnectionManager
  • GlobalHost.TraceManager
  • GlobalHost.HubPipeline
  • 當然和GlobalHost.DependencyResolver

鏈接到(SignalR: Sending data using GlobalHost.ConnectionManager not working)的SO帖子Lars向您展示瞭如何從您的自定義依賴項解析器獲取ConnectionManager;你可以爲GlobalHost上的所有其他屬性做同樣的事情。

1

我假設你正在執行第二種方法,但仍嘗試使用GlobalHost依賴關係解析器。

如果通過第二種方法連接自定義依賴項解析程序,那麼GlobalHost的依賴項解析程序將不會與您傳遞到自定義中心配置的相同。

因此,爲了能繼續使用GlobalHost對象,你需要做你的第二個方法,並設置GlobalHost依賴解析器:

var resolver = new CustomSignalRDependencyResolver(...); 
app.MapSignalR(new HubConfiguration(
{ 
    Resolver = resolver 
}); 
GlobalHost.DependencyResolver = resolver; 

希望這有助於!

+0

不。在我的第二種方法中,我沒有使用GlobalHost。 – Dejan

+0

不應該有問題,那麼所有的電線在幕後 –

+1

正是我的想法......因此,我的問題。 – Dejan