我正在尝试构建一个从队列中提取命令和查询的微服务。我的服务监视特定队列并关闭一条消息,该消息可以是该域的任何类型命令。该消息被拉出并传递给调度员。我的问题是,在尝试使所有内容尽可能通用时,我的消息将作为对象传递给调度程序,但调度程序需要一个具体的IQuery类。我可以将它转换为IQuery,因为我知道它是那种类型,但是当我尝试根据类型解析调度程序中的依赖项时,它会失败,因为具体类型是未知的。我会尝试将代码示例保持在较小的位置:
主要服务
private static async Task HandleMessageReceived(MessageReceivedEventArgs args) {
await queryDispatcher.Dispatch((IQuery)args.Message.Payload);
}
查询调度程序
public class QueryDispatcher : IQueryDispatcher {
#region attributes
private readonly IComponentContext _context;
#endregion
#region ctor
public QueryDispatcher(IComponentContext context) {
_context = context;
}
#endregion
#region methods
public async Task<IEvent> Dispatch<T>(T query) where T : IQuery{
if (query == null) {
return new ArgumentNullEvent(nameof(query));
}
var validator = _context.Resolve<IValidator<T>>();
var handler = _context.Resolve<IQueryHandler<T>>();
List<ValidationResult> errors = await validator.Validate(query);
if(errors.Count == 0) {
return await handler.Handle(query);
} else {
return new ValidationFailedEvent(query.Id, errors);
}
}
#endregion
}
队列消息
public class QueueMessage {
public Guid OperationId { get; set; }
public object Payload { get; set; }
}
具体IQuery Impl
public class GetSite : BaseQuery, IQuery {
public Guid SiteGuid { get; set; }
}
答案 0 :(得分:0)
您可以使用MakeGenericType构建类型:
<div id="myNav" class="overlay">
<a href="javascript:void(0)" class="closebtn" onclick="closeNav()">×</a>
<div class="overlay-content">
<a href="#">About</a>
<a href="#">Services</a>
<a href="#">Clients</a>
<a href="#">Contact</a>
</div>
</div>
<h2>Fullscreen Overlay Nav Example</h2>
<span class="front" style="font-size:30px;cursor:pointer" onclick="openNav()">☰ open</span>