2012-03-15 2 views
0

Unity를 DI 컨테이너로 사용하고 있으며 SignalR 허브를 해결할 때 제대로 작동하지 못했습니다. 누구도 성공 했나요? 먼저 다음의 기본 해상도를 수행하려고 왜 내가에 관해서는 조금 혼란 스러워요UnityContainer를 SignalR Dependency Resolver로 사용

+0

Unity에서 'IJavaScriptMinifier' 구현에 등록하셨습니까? –

+0

나는 이것을 게시했지만 해킹 된 느낌이 들었다. (나는 방법을 보여주기 위해 그 포스트를 편집 할 것이다). 명시 적으로 사용하지 않고 SignalR 인터페이스입니다. – timDunham

+0

아마도 응용 프로그램에서 명시 적으로 사용하지 않을 수도 있습니다. 그러나 당신의 기반 시설이 그것에 의존하고 SignalR이'DependencyResolver'를 사용하여'IJavaScriptMinifier'의 구현체를 얻는다면 그것을 당신의 컨테이너에 등록해야합니다. 나는 그것을 리졸 빙자의 생성자 안에 등록하지 않고, 앱의 응용 프로그램 루트에있는 다른 모든 의존성과 함께 등록합니다. –

답변

0

SignalR.Infrastructure.IJavaScriptMinifier를 해결할 수

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에서 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 to catch 예외를 사용하면 성능이 저하되므로 if를 사용하여 먼저 해결할 수 있는지 확인하는 것이 좋습니다. –

+0

제안 해 주셔서 감사합니다. Jan. 오늘 밤이 문제를 해결하고 의견을 보내 드리겠습니다. – timDunham

+0

Gary.S -> 수정. 메모를위한 고맙습니다. –