2012-07-06 61 views
3

我正在使用SignalR 0.5.2,並試圖使用Unity設置DependencyResolver。我寫了最簡單的代碼。我有我試圖注入該集線器看起來像這樣:爲SignalR創建Unity DependencyResolver

public class SimpleHub : Hub 
{ 
    private readonly ITestService _service; 

    public SimpleHub(ITestService service) 
    { 
     _service = service; 
    } 

    public void Update() 
    { 
     Clients.callback("Kevin"); 
    } 
} 

和看起來像這樣一個DependencyResolver:

public class UnityDependencyResolver : DefaultDependencyResolver 
{ 
    private readonly IUnityContainer _container; 

    public UnityDependencyResolver(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public override object GetService(Type serviceType) 
    { 
     if (_container.IsRegistered(serviceType)) 
     { 
      return _container.Resolve(serviceType); 
     } 
     return base.GetService(serviceType); 
    } 

    public override IEnumerable<object> GetServices(Type serviceType) 
    { 
     if (_container.IsRegistered(serviceType)) 
     { 
      return _container.ResolveAll(serviceType); 
     } 
     return base.GetServices(serviceType); 
    } 
} 

我在Global.asax中

註冊依賴解析器
protected void Application_Start() 
{ 
    IUnityContainer container = new UnityContainer(); 
    InitializeContainer(container); 
    SignalR.IDependencyResolver resolver = new UnityDependencyResolver(container); 
    GlobalHost.DependencyResolver = resolver; 
    RouteTable.Routes.MapHubs(); 
    // more MVC stuff here 
} 

其中InitializeContainer註冊ITestService在Unity

解析器「工作s「,因爲它會調用所有的SignalR類型,如果我使用默認構造函數離開我的中心,它將全部加載。然而,解析器永遠不會被要求解析ITestService接口。

我也試過將解析器傳遞給MapHubs,仍然沒有運氣。我也嘗試使用[Dependency]屬性進行屬性注入,但這也不起作用。

我是否需要向MVC註冊解析器? (我試圖通過實現兩個IDependecyResolver接口,但得到一個異常告訴我解析器沒有實現IServiceLocator)

回答

2

所以我解決了這個問題。我想知道集線器是否註冊到信號容器並且接口是在Unity容器中註冊的,這是造成這個問題的原因。所以我用Unity註冊了Hub,然後一切正常。

這種情況很有意義,因爲有兩個容器。

這是標準行爲嗎?

+1

這是設計。如果你仔細想想,你可以設置你想要由容器創建的東西,並讓其他所有東西落在默認容器上。如果你把東西注入集線器,那麼你需要註冊你的集線器(tho真棒DI容器,像ninject自動做:))。請參閱JabbR https://github.com/davidfowl/JabbR/blob/master/JabbR/App_Start/Bootstrapper.cs#L51和Ninject impl https://github.com/SignalR/SignalR.Ninject/blob/master/SignalR。 Ninject/NinjectDependencyResolver.cs – davidfowl 2012-07-07 21:02:56

+0

感謝大衛,我認爲是這種情況 – 2012-07-08 14:17:22

+1

換句話說,需要將'container.RegisterType ();'添加到Application_Start()。 – vladimir77 2013-06-28 11:07:52

1

萬一別人是不知道......我發現,使用

  • SignalR 1.0.1
  • 統一3
  • 一堆其他框架的一個很好的例子SPA

有趣的是他創建容器的方式,依賴關係和其他一切。值得checking it out