CQS与调度员投射问题

时间:2017-11-16 00:48:31

标签: c#

我正在尝试构建一个从队列中提取命令和查询的微服务。我的服务监视特定队列并关闭一条消息,该消息可以是该域的任何类型命令。该消息被拉出并传递给调度员。我的问题是,在尝试使所有内容尽可能通用时,我的消息将作为对象传递给调度程序,但调度程序需要一个具体的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; }
}

1 个答案:

答案 0 :(得分:0)

您可以使用MakeGenericType构建类型:

<div id="myNav" class="overlay">
  <a href="javascript:void(0)" class="closebtn" onclick="closeNav()">&times;</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()">&#9776; open</span>