在我的Angular项目中,在我的项目中使用TypedHub接口(称为IDemoHubTypedClient),如下所示:
IDemoHubTypedClient:
router.get
但是,由于我继承自router.get('/add_to_cart/:id', (req, res)=> {
//check if cart has an object otherwise pass empty object
const productID = req.params.id;
console.log(productID);
const cart = new Cart(req.session.cart ? req.session.cart : {});
//mysql statement find product by // ID
let sql ="SELECT * FROM products WHERE id = ? LIMIT 1";
let query = db.query(sql, id, (err, result)=>{
if(err) throw err;
console.log(result);
if(result.length){
cart.add(product, product.id);
req.session.cart;
console.log(req.session.cart);
res.redirect("/");
}
});
});
而不是public interface IDemoHubTypedClient
{
Task BroadcastData(object data);
Task SendMessageToClient(string title, string name, string message);
}
,因此无法访问默认的中心方法,即Hub<IDemoHubTypedClient>
,如下所示,只能访问{{1}中的方法},即Hub
和SendAsync()
。当我需要使用此结构来使用DI和TypedHub时,如何解决此问题?是否应在IDemoHubTypedClient
中添加所有集线器方法(BroadcastData()
等)?如您所知,这些方法只有在客户端使用的密封(我称SendMessageToClient()
方法,而该方法实际上在客户端)。有想法吗?
DemoHub:
SendAsync()
答案 0 :(得分:2)
我认为,如果要使用强类型的集线器,则必须在接口上定义所有客户端方法。 AFAIK无法在强类型集线器和普通集线器之间“混合匹配”。如果您有这样的客户:
this.connection.on('receiveMessage', (message: string) => {
// Do things
});
this.connection.on('receiveData', (data: MyData, message: string) => {
// Do things
});
然后,如果要使用强类型集线器,则必须使用使用相同名称和签名(方法名不区分大小写)的方法定义强类型集线器接口:
public interface IDemoClient
{
Task ReceiveMessage(string message);
Task ReceiveData(MyData data, string message);
}
优点是您可以写await Clients.All.ReceiveMessage("Hello from server!")
而不是await Clients.All.SendAsync("ReceiveMessage", "Hello from server!")
。整个要点是,您不必对客户端方法名称进行硬编码,并且可以对方法参数进行其他静态类型检查。
答案 1 :(得分:0)
这不是那么容易。您需要准备好SignalR ConnectionManager(依赖关系注入),并从那里获取键入的HubContext,然后才能访问给定的Hub的功能。 在此处查看更多信息:https://codeopinion.com/practical-asp-net-core-hubcontext/