2012-03-15 20 views
0

我使用Unity作爲我的DI容器,在解析SignalR集線器時我無法使其工作。有沒有人有過這個成功?我已經試過如下:使用UnityContainer作爲SignalR依賴關係解析器

public class UnityDependencyResolver : DefaultDependencyResolver 
    { 
     private readonly IUnityContainer _Container; 



    public UnityDependencyResolver (IUnityContainer container) 
      { 
       _Container = container; 
       //edit to add 
       container.RegisterInstance<IJavaScriptMinifier>(NullJavaScriptMinifier.Instance); 

      } 

     public override object GetService(Type serviceType) 
     { 
      return base.GetService(serviceType) ?? _Container.Resolve(serviceType); 
     } 

     public override IEnumerable<object> GetServices(Type serviceType) 
     { 
      return base.GetServices(serviceType) ?? _Container.ResolveAll(serviceType); 
     } 

    } 

,但我發現指示錯誤無法解析SignalR.Infrastructure.IJavaScriptMinifier

+0

您是否註冊過使用Unity的'IJavaScriptMinifier'實現? – 2012-03-15 08:37:02

+0

我發佈這個後,我試過,但它感覺像一個黑客。 (我將編輯帖子以顯示如何)。我沒有明確地使用它,它是一個SignalR接口。 – timDunham 2012-03-15 12:52:51

+0

也許你沒有明確地在你的應用程序中使用它。但是如果你的基礎設施依賴於它並且SignalR使用'DependencyResolver'來實現'IJavaScriptMinifier'的實現,你需要在你的容器中註冊它。我不會將它註冊到解析器的構造函數中,而是與您應用程序的應用程序根目錄中的所有其他依賴項一起註冊。 – 2012-03-15 13:35:45

回答

0

我作爲一個有點困惑,爲什麼你試着先做好基本分辨率統一解析器第二。通常,如果您要用自己的實現來替換基本實現,兩者都將解決,但您的應該是第一個,以便返回您的重寫類的實例。例如,假設你想覆蓋SignalR中的IConnectionIdFactory。您可以創建自己的類,該類繼承自給定的接口,然後使用Unity註冊它。那麼你的依賴解析器應該能夠解析給定的依賴關係並返回,而不會觸及SignalR解析器。我把一個小的測試應用程序,我的依賴解析器是這樣的:

扶養解析器:

public class UnityResolver : DefaultDependencyResolver 
{ 
    private readonly IUnityContainer _container; 
    public UnityResolver(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); 
    } 
} 

它來測試我們是否擁有一個分辨率路徑Resolve將引發與團結的重要如果不存在,則爲例外。

爲了完整起見,這裏是實現:

ConnectionIDFactory:

public class ConnectionIdFactory : IConnectionIdFactory 
{     
    public string CreateConnectionId(IRequest request) 
    {    
     return Guid.NewGuid().ToString(); 
    } 
} 

報名:

public class Bootstrapper 
{ 
    public static void Pre_Start() 
    { 
     Container.DefaultContainer.Instance.RegisterType(
      typeof(IConnectionIdFactory), 
      typeof(Repositories.ConnectionIdFactory), 
      null, 
      new Microsoft.Practices.Unity.ContainerControlledLifetimeManager()); 

     AspNetHost.SetResolver(new Resolvers.UnityResolver(Container.DefaultContainer.Instance)); 
    } 
} 
+0

感謝您的回覆。我最初是在檢查我的容器,然後是基類,但一直運行到我提到的'IJavaScriptMinifier'錯誤。我認爲這可能與Unity有關,因爲樣本(使用Ninject)似乎有效。最後,我認爲這可能是SignalR中的一個錯誤。 – timDunham 2012-03-19 02:22:42

+0

@timDunham不,它不是signalR中的一個bug,如果它不能解決,只是返回null而SignalR會做正確的事情。你看到的錯誤是來自Unity,而不是來自SignalR。如前所述,Unity會在呼叫中拋出異常,以解決未註冊的服務。 – 2012-03-19 03:38:24

0

昨天我通過以下方式解決了這個問題:

註冊容器:

AspNetHost.SetResolver(dependencyResolver); 
    DependencyResolver.SetResolver(dependencyResolver); 

解析器:

public class UnityDependencyResolver : DefaultDependencyResolver, IDependencyResolver 
    { 
     private readonly IUnityContainer _container; 

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

     #region IDependencyResolver Members 

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

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

     #endregion 
    } 

樞紐:

public class Chat : Hub 
    { 
     [Dependency] 
     public UserService _userService { get; set; } 

     public void Send(string message) 
     {     
      _userService.SomeMethod();     
     } 
    } 

完美的作品!

+1

使用捕獲所有捕獲解決異常是不好的,並會降低性能,更好地確定是否可以首先與if分辨率。 – 2012-03-26 10:14:42

+0

感謝您的建議1月,我會在今晚嘗試一下,並給您反饋。 – timDunham 2012-03-26 23:36:29

+0

Gary.S - >正確。 Thanx爲筆記。 – 2012-03-30 21:29:37