2015-01-30 2 views
3

어떻게이 오류를 해결할 수 있습니까?SignalR 구조체 종속성 해결 프로그램 (Microsoft.AspNet.SignalR.Messaging.IMessageBus에 지정됨)

버전

Microsoft.AspNet.SignalR.Core 2.2.0, 3.1.4.143

은 Global.asax에 signalR 의존성

// SIGNALR DEPENDENCY RESOLVER 
     GlobalHost.DependencyResolver = new StructureMapSignalRDependencyResolver(Container ?? ObjectFactory.Container); 

StructureMapSignalRDependencyResolver

public class StructureMapSignalRDependencyResolver : DefaultDependencyResolver 
{ 
    private readonly IContainer _container; 
    public StructureMapSignalRDependencyResolver(IContainer container) 
    { 
     _container = container; 
    } 

    public override object GetService(Type serviceType) 
    { 
     object service = null; 
     //Below is a key difference between this StructureMap example, GetInstance is used for concrete classes. 
     if (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass) 
     { 
      //If the type is a concrete type we get here... 
      service = _container.GetInstance(serviceType); 
     } 
     else 
     { 
      // Non concrete resolution which uses the base dependency resolver if needed. 
      service = _container.TryGetInstance(serviceType) ?? base.GetService(serviceType); 
     } 
     return service; 
    } 

    public override IEnumerable<object> GetServices(Type serviceType) 
    { 
     var objects = _container.GetAllInstances(serviceType).Cast<object>(); 
     return objects.Concat(base.GetServices(serviceType)); 
    } 
} 

erorr를 해결 structuremap

없음 기본 인스턴스가 등록되지 않고 자동으로 유형을 판별 할 수없는 'Microsoft.AspNet.SignalR.Messaging.IMessageBus'

1 Microsoft.AspNet.SignalR.Messaging.IMessageBus

에 지정된에는 구성은 없습니다 .) 새로운 AckSubscriber (IMessageBus의 기본, IAckHandler) 2) Microsoft.AspNet.SignalR.Infrastructure.AckSubscriber 3) Microsoft.AspNet.SignalR.Infrastructure.AckSubscriber (4)의 인스턴스의 기본값) 컨테이너 .GetInstance (Microsoft.AspNet.Sig. 나는 임시 찾았지만 오류가 계속

enter image description here

답변

0

enter image description here

nalR.Infrastructure.AckSubscriber) .. 어떻게이 {이름 = "AckSubscriber"하면 FullName = "Microsoft.AspNet.SignalR 레지스트리 수 있습니다. Infrastructure.AckSubscriber "}

임시 방편은 캐치는 null에, 캐치를 시도하다

public override object GetService(Type serviceType) 
    { 

     try 
     { 
      object service = null; 
      //Below is a key difference between this StructureMap example, GetInstance is used for concrete classes. 
      if (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass) 
      { 
       //If the type is a concrete type we get here... 
       service = _container.GetInstance(serviceType); 
      } 
      else 
      { 
       // Non concrete resolution which uses the base dependency resolver if needed. 
       service = _container.TryGetInstance(serviceType) ?? base.GetService(serviceType); 
      } 
      return service; 
     } 
     catch (Exception exc) 
     { 
      return null; 
     } 
    } 
5

먼저 기본 클래스에서 문제를 해결하십시오.

public override object GetService(Type serviceType) 
    { 
     if (serviceType == null) 
      return null; 

     var service = base.GetService(serviceType); 
     if (service != null) return service; 

     return (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass) 
      ? container.GetInstance(serviceType) 
      : container.TryGetInstance(serviceType); 
    } 
+0

SM 버전 3에서 컨테이너 또는 콘크리트 유형의 'container.TryGetInstance (serviceType)'과의 차이점이 없으므로'return container.TryGetInstance (serviceType); '만 사용하십시오. – LetMeCodeThis

+0

@LetMeCodeThis 같은 것을 생각하지만, 기이하게도 그렇게 단순화하려고 시도했을 때 효과가 없었습니다. – JohnnyHK

1

위의 @ajm 대답은 나를 위해 오류를 건너 뛸 수 있지만 내 클라이언트 측 메서드는 호출되지 않았습니다.

SignalR.Infrastructure.PrincipalUserIdProvider이 내 맞춤 IUserIdProvider 대신 해결되었으므로 컨테이너 점검을 먼저 추가하여 답변을 약간 수정해야했습니다. 당신이 TryGetInstance() 반환 구체적인 유형의 null로 StructureMap 3를 사용 하지을 경우

public override object GetService(Type serviceType) 
    { 
     if (serviceType == null) 
      return null; 

     var service = _container.TryGetInstance(serviceType) ?? base.GetService(serviceType); 
     if (service != null) return service; 

     return (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass) 
      ? _container.GetInstance(serviceType) 
      : _container.TryGetInstance(serviceType); 
    } 

보조 용기 검사

은 여전히 ​​필요하다.