2

目前正在远离处理命令同步并将它们放置到消息总线上以便稍后处理它们但是在尝试加载命令而不是键入每个命令时返回真实类型时遇到问题

这是我到目前为止所拥有的,似乎工作正常

命令调度程序

  public class CommandDispatcher : ICommandDispatcher
{
    private readonly IBus _commandBus;

    public CommandDispatcher(IBus commandBus)
    {
        _commandBus = commandBus;
    }

    public void Dispatch<TCommand>(TCommand command) where TCommand : ICommand
    {
        var messageType = typeof(TCommand);

        _commandBus.Publish(messageType, command);
    }

订阅命令

  bus.Subscribe<CommandOne>("key", HandleCommand);
  bus.Subscribe<CommandTwo>("key", HandleCommand);

处理消息

   private void HandleCommand<TCommand>(TCommand command) where TCommand : ICommand
    {
        var handler = _container.Resolve<ICommandHandler<TCommand>>();

        handler.Handle(command);
    }

我基本上想按惯例解决我的消息,所以这就是我想要实现的目标,所以我不必键入每个命令类型,但在找回类型时遇到问题

        var commandAssembly = Assembly.GetAssembly(typeof(ICommand));

        var commands = commandAssembly.GetTypes().Where(x => typeof(ICommand).IsAssignableFrom(x));

        foreach (var command in commands)
        {
            bus.Subscribe(command, "key", x =>
            {
                HandleCommand(x);

            });
        }

现在 x 只是一个我不能传递给 Handlecommand 方法的对象

我将 autofac 用于我的容器,将 easynetq 用于我的总线。

4

1 回答 1

0

我认为这部分:

   private void HandleCommand<TCommand>(TCommand command) where TCommand : ICommand
    {
        var handler = _container.Resolve<ICommandHandler<TCommand>>();

        handler.Handle(command);
    }

全部由 AutoSubscriber 为您完成,如果您实施IConsume<T>而不是ICommandHandler<T>,它们似乎具有相同的目的。

https://github.com/EasyNetQ/EasyNetQ/wiki/Auto-Subscriber

ICommandHandler<T>您需要单独的界面是否有任何具体原因?

另一方面:在您的实现中,您在解析命令处理程序时没有创建单独的“范围”,导致处理程序的每个实例(以及任何依赖项)永远存在于“根”范围内。换句话说:内存泄漏:)

如果你仍然想坚持你的实现,我认为最好做这样的事情:

   private void HandleCommand<TCommand>(TCommand command) where TCommand : ICommand
    {
        using(var scope = _container.BeginLifetimeScope("my-command-scope"))
        {
          var handler = scope.Resolve<ICommandHandler<TCommand>>();
          handler.Handle(command);
        }
    }

但是,如果您使用 AutoSubscriber,这就是 AutofacMessageDispatcher 将为您做的事情:

https://github.com/EasyNetQ/EasyNetQ/blob/master/Source/EasyNetQ.DI.Autofac/AutofacMessageDispatcher.cs

于 2016-09-06T08:33:37.420 回答