허브가있는 외부 프로젝트의 메서드에서 SignalR HubContext를 통해 메시지 보내기
Dec 08 2020
API, 서비스 및 데이터 레이어가 모두 동일한 솔루션의 별도 프로젝트에있는 WebAPI 프로젝트가 있습니다. 내 서비스 프로젝트의 메서드의 일부로 API 프로젝트의 허브에 연결된 클라이언트에 메시지를 보내고 싶습니다. 지금까지 내가 찾은 모든 예제에는 단일 프로젝트에 모든 것이 포함되어 있으며 컨트롤러를 허브를 통해 메시지를 보내는 예제로 사용합니다.
종속성 주입 (Autofac)을 시도했지만 MessageHub에 대한 참조를 가져올 수 없습니다.

[HubName("messages")]
public class MessageHub : Hub
{
public void ShowNewMessage(string message)
{
Clients.All.showMessageOnPage(message);
}
}
Injecting에 대한 나의 시도는 여기에서 볼 수 있습니다 : Autofac을 사용하여 SignalR IHubContext를 서비스 계층에 주입
답변
1 AlexanderI. Dec 08 2020 at 04:41
이 옵션을 검토하십시오.
- 서비스 (또는 더 나은 도메인) 레이어 프로젝트에서 일반 허브 인터페이스를 정의합니다. 같은 것
IMessageBroker
. - 프레젠테이션 레이어 (WebAPI) 프로젝트 내에서이 인터페이스를 구현하고
IConnectionManager
HubContext 검색에 사용 합니다. - 프레젠테이션 계층의 IoC 컨테이너 (Autofac)에 인터페이스 등록
- App Service 내부에 인터페이스 삽입
의사 코드 :
도메인 계층 :
public interface IMessageBroker
{
void ShowNewMessage(string message)
}
서비스 계층 :
public class NotificationService: INotificationService
{
private readonly IMessageBroker _messageBroker;
public NotificationService(IMessageBroker messageBroker)
{
_messageBroker = messageBroker;
}
public void RunNotification(string message)
{
_messageBroker.ShowNewMessage(message);
}
}
프리젠 테이션 레이어 :
[HubName("messages")]
public class MessageHub: Hub
{
public void ShowNewMessage(string message)
{
Clients.All.showMessageOnPage(message);
}
}
public class MessageBroker: IMessageBroker
{
private readonly IConnectionManager _connectionManager;
public MessageBroker(IConnectionManager connectionManager)
{
_connectionManager = connectionManager;
}
public void ShowNewMessage(string message)
{
var hub = _connectionManager.GetHubContext<MessageHub>();
// Use Hub Context and send message
}
}
Autofac 등록 (프레젠테이션 레이어) :
// Register Hubs
builder.RegisterHubs(Assembly.GetExecutingAssembly());
// Register Autofac resolver into container to be set into HubConfiguration later
builder.RegisterType<AutofacDependencyResolver>().As<IDependencyResolver>().SingleInstance();
// Register ConnectionManager as IConnectionManager so that you can get hub context via IConnectionManager injected to your service
builder.RegisterType<ConnectionManager>().As<IConnectionManager>().SingleInstance();
// Register interface
builder.RegisterType<MessageBroker>().As<IMessageBroker>();
또한 유사한 SO 주제가 여기에 있습니다 .