2012-03-15 13 views
0

私はUnityをDIコンテナとして使用しています。私は、SignalRハブを解決する際に動作させることができませんでした。誰もこれで成功したのですか?私は、次のことを試してみた:UnityContainerをSignalR Dependency Resolverとして使用

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'の実装に登録しましたか? –

+0

これを投稿した後に試しましたが、ハックのように感じました。 (私は方法を示すために投稿を編集する)。私はそれを明示的に使用していないし、それはSignalRインターフェイスだ。 – timDunham

+0

あなたのアプリケーションで明示的に使用していないことがあります。しかし、あなたのインフラストラクチャがそれに依存している場合、SignalRは 'DependencyResolver'を使って' IJavaScriptMinifier'の実装を取得します。これをコンテナに登録する必要があります。私はリゾルバのコンストラクタの中に登録するのではなく、あなたのアプリケーションのアプリケーションルートにある他のすべての依存関係と一緒に登録します。 –

答えて

0

を解決できない旨のエラーを取得しています統一レゾルバは2番目です。通常、ベースの実装を自分のものに置き換える場合は、どちらも解決されますが、あなたの優先クラスが返されます。たとえば、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'エラーが発生し続けました。サンプル(Ninjectを使用している)がうまくいくように見えるので、Unityと何か関係があると思っていました。最後に、私はこれがSignalRのバグかもしれないと思っています。 – timDunham

+0

@timDunhamいいえ、signalRのバグではありません。解決できない場合はnullを返し、SignalRは正しいことを行います。あなたが見ているエラーは、Unityのものであり、SignalRのものではありません。前述したように、Unityは、登録されていないサービスを解決するための呼び出しで例外をスローします。 –

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

catch allを使用して例外をキャッチするとパフォーマンスが低下し、最初にifで解決できるかどうかを判断する方がはるかに優れています。 –

+0

提案していただきありがとうございますJan.私は今夜これを試して、フィードバックをお送りします。 – timDunham

+0

Gary.S - >正しい。ノートのためのThanx。 –

関連する問題