Unity를 DI 컨테이너로 사용하고 있으며 SignalR 허브를 해결할 때 제대로 작동하지 못했습니다. 누구도 성공 했나요? 먼저 다음의 기본 해상도를 수행하려고 왜 내가에 관해서는 조금 혼란 스러워요UnityContainer를 SignalR Dependency Resolver로 사용
답변
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));
}
}
응답 해 주셔서 감사합니다. 원래 컨테이너를 먼저 확인한 다음 기본 클래스를 확인했지만 앞서 언급 한 'IJavaScriptMinifier' 오류가 계속 발생했습니다. Ninject를 사용하는 샘플이 작동하는 것처럼 Unity와 관련이있을 것이라고 생각했습니다. 결국 이것은 SignalR의 버그 일 수 있다고 생각합니다. – timDunham
@timDunham 아니오, 해결할 수없는 경우 signalR의 버그가 아니며 null 만 반환하면 SignalR은 올바른 작업을 수행합니다. 당신이보고있는 오류는 Unity의 것이지 SignalR의 오류는 아닙니다. 앞서 언급했듯이 Unity는 등록되지 않은 서비스를 해결하기위한 호출에 예외를 던질 것입니다. –
어제 :
여기에 완성도를 위해서 는 구현컨테이너를 등록 :
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();
}
}
작품!
catch all to catch 예외를 사용하면 성능이 저하되므로 if를 사용하여 먼저 해결할 수 있는지 확인하는 것이 좋습니다. –
제안 해 주셔서 감사합니다. Jan. 오늘 밤이 문제를 해결하고 의견을 보내 드리겠습니다. – timDunham
Gary.S -> 수정. 메모를위한 고맙습니다. –
허브에 유니티 컨테이너를 삽입하는 또 다른 방법은 직접 HubActivator를 생성하는 것입니다. 시도해보십시오. https://stackoverflow.com/a/30887576/3000736
- 1. SignalR Dependency Resolver가 Javascript 허브에서 작동하지 않습니다.
- 2. WebRTC의 서비스 레이어로 SignalR 사용
- 3. SignalR connect에서 세션 사용 방법
- 4. SignalR 및 AspNetHost.DependencyResolver
- 5. SignalR (504) 오류/signalr/longPolling
- 6. 웹 프록시를 통한 SignalR 클라이언트 사용
- 7. tools.jar dependency
- 8. SignalR 내가 간단한 SignalR 샘플을 활용하는 트링하고
- 9. query guice dependency graph
- 10. UnityContainer를 사용하여 코드 숨김을 통해보기로 종속성을 주입하십시오.
- 11. Require.js + SignalR
- 12. SignalR Disconections
- 13. signalR overhead
- 14. Flot이있는 SignalR
- 15. SignalR 및
- 16. Turn turn 게임 : SignalR 또는 SignalR 및 REST API를 모두 사용 하시겠습니까?
- 17. SignalR 잡기 예외
- 18. SignalR 및 500 오류
- 19. Maven2 Plugin dependency
- 20. Oracle Forms Dependency
- 21. Python-dependency, windows (CMake)
- 22. Jquery Required Dependency Expression
- 23. java maven rebuild dependency
- 24. Spring Transitive Dependency Injection
- 25. registerattached 도움말 Dependency 속성
- 26. C# Dependency Injection
- 27. Flurry Dependency Analysys 경고
- 28. Zendframework2 Dependency Injection Confusion
- 29. submodules dependency graph
- 30. Zend Dependency Injection
Unity에서 'IJavaScriptMinifier' 구현에 등록하셨습니까? –
나는 이것을 게시했지만 해킹 된 느낌이 들었다. (나는 방법을 보여주기 위해 그 포스트를 편집 할 것이다). 명시 적으로 사용하지 않고 SignalR 인터페이스입니다. – timDunham
아마도 응용 프로그램에서 명시 적으로 사용하지 않을 수도 있습니다. 그러나 당신의 기반 시설이 그것에 의존하고 SignalR이'DependencyResolver'를 사용하여'IJavaScriptMinifier'의 구현체를 얻는다면 그것을 당신의 컨테이너에 등록해야합니다. 나는 그것을 리졸 빙자의 생성자 안에 등록하지 않고, 앱의 응용 프로그램 루트에있는 다른 모든 의존성과 함께 등록합니다. –