我有一个服务类,看起来像:
class BillingService
{
public void CheckBillingStatus(BillingOperationRequestDto dto)
{
}
public void AnotherOperationOnBillings(BillingOperationRequestDto dto)
{
}
}
我还有另一个类,它从RabbitMq监听一些队列。我想写这样的东西:
class MessageListener<T> where T : BaseDto {
public void GetMessage<T>(Func ... )
MessageListener<T>(string queueToListen)
{
}
}
此代码背后的想法是,我想将其用作:
BillingService bs = new BillingService();
var listener = new MessageListener<BillingOperationRequestDto>();
listener.GetMessage<BillingOperationRequestDto>(bs.CheckBillingStatus);
我不仅要指定队列中期望的数据,还要指定对该数据调用哪种方法。这是正确的方法吗?我本来打算只从队列中获取一条消息,然后再将数据发送给另一类,但没有找到解决办法,所以决定循环运行GetMessage并指定出现消息时应执行的操作。
更新#1.1: 有没有办法将委托发送到
listener.GetMessage<BillingOperationRequestDto>(bs.CheckBillingStatus);
如果我在BillingService类中的方法将具有不同的方法签名?例如,
public BillingStatusResult CheckBillingStatus(BillingOperationRequestDto dto)
{
}
public AnotherReturnValue AnotherOperationOnBilling(BillingOperationRequestDto dto, string requestedIp, TimeSpan period)
{
}
答案 0 :(得分:4)
如@juharr所述,您可以使用通用委托(如果需要从委托中检索结果,则其类型为Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim r As Range
Intersect(Columns("H"), ActiveSheet.UsedRange).Font.Color = vbBlack
Set r = Intersect(Range("N:N"), Target)
If r Is Nothing Then Exit Sub
Cells(r.Row, "H").Font.Color = vbWhite
Intersect(Columns("I"), ActiveSheet.UsedRange).Font.Color = vbBlack
Set r = Intersect(Range("N:N"), Target)
If r Is Nothing Then Exit Sub
Cells(r.Row, "I").Font.Color = vbWhite
End Sub
或Action<T>
)。
您可以在this问题或documentation中找到更多信息
Func<T, TResult>
答案 1 :(得分:0)
Func<T, TResult>
是返回结果的委托。您将要使用Action<T>
,它不会返回结果。 Action<T>
的通用类型参数必须与您要传递的方法的签名匹配。
通常,当使用来自消息队列的消息时,您将具有一个侦听器类,该类包装该消息队列的客户端,并且将在您的侦听器中处理MessageReceived事件(我一般地说-我(尚未与RabbitMQ一起专门使用)。因此您的听众可能看起来像这样(伪代码):
class MessageListener<T> where T : BaseDto {
var _client = new QueueClient();
MessageListener<T>(string queueToListen, Action<T> onMessageReceived)
{
_client = new QueueClient("<your_connection_string>", queueToListen);
_client.MessageReceived += onMessageReceived;
}
}
用法将是这样的:
BillingService bs = new BillingService();
var listener = new MessageListener<BillingOperationRequestDto>("myQueue", bs.CheckBillingStatus);