注入一个 class 来订阅一个内部事件

Inject a class to subscribe to an inner event

我有以下内容:

public class Process
{
    private Action<Result> CaptureFinished = null;

    public Result StartProcess(Action<Result> onCaptureFinished)
    {
        CaptureFinished = onCaptureFinished;

        Console.WriteLine("Process invokes capture");
        CaptureFinished.Invoke(new Result("This is the capture"));

        return new Result("OK");
    }
}

为了让这个 class 被另一个进程消耗并以非线性方式捕获某些东西,方法 OnCaptureFinished 帮助消耗进程获得捕获。

public class Consumer
{
    private Process _process;

    public Consumer(Process process)
    {
        _process = process;
        _process.StartProcess(Consume);
    }

    public void Consume(Result result)
    {
        Console.WriteLine("Consumer receives: {0}", result.ToString());
    }
}

我被迫创建另一个进程来获取 "Process1" class 交付的捕获,这个其他进程无法使用 StartProcess 方法(如 class 消费者上面),但可以控制 "Process" class 的创建,因此我正在考虑注入另一个可以链接到 OnCaptureFinished 方法的对象。可以使用事件处理程序吗?

您可以使用 .NET 远程处理进行进程间通信。您可以在 .NET 远程处理上使用 .NET 事件。

这是一篇关于该主题的文章:https://www.codeproject.com/Articles/62813/NET-Remoting-Events-Explained

您可能还想探索异步通信。

如果您只是 运行 同一进程中的一个单独的应用程序域,您可以使用 MarshalByRefObject 来代理应用程序域的调用 in/out。

如果你注入另一个 class(比如嗅探器):

public class Sniffer
{
    public Sniffer(){}

    public void ProcessResult(Result result)
    {
        Console.WriteLine("Sniffer I have: {0}", result);
    }
}

在您现有的流程中 class:

public class Process
{
    private Action<Result> CaptureFinished = null;
    private Sniffer _sniffer;

    public Process(Sniffer sniffer)
    {
        _sniffer = sniffer;
    }

    public Result StartProcess(Action<Result> onCaptureFinished)
    {
        CaptureFinished = onCaptureFinished;
        ...
        CaptureFinished.Invoke(result);
        _sniffer.ProcessResult(result);

        return new Result("OK");
    }
}

完成后,您可以在嗅探器 class 中获取消息,并从主线程调用它:

_sniffer = new Sniffer();
_process = new Process(_sniffer);

这是您要找的吗?

基于@Juanito 的回答。我设计了以下内容:

public class Sniffer
{
    public Action<Result> CaptureFinishedSniffed;

    public Sniffer()
    {
        CaptureFinishedSniffed = Captured;
    }

    public void Captured(Result result)
    {
        Console.WriteLine("Proper sniffer I have: {0}", result);
    }
}

然后在过程中 class:

public class Process
{
    private Action<Result> CaptureFinished = null;
    private Action<Result> CaptureSniffed = null;
    private Sniffer _sniffer;

    public Process(Sniffer sniffer)
    {
        _sniffer = sniffer;                             //1. INJECTION
        CaptureSniffed = sniffer.CaptureFinishedSniffed;//2.Plumbing with the delegate
    }

    public Result StartProcess(Action<Result> onCaptureFinished)
    {
        CaptureFinished = onCaptureFinished;
        ...
        CaptureFinished.Invoke(result);
        CaptureSniffed.Invoke(result);                  //3.Invoking
        return new Result("OK");
    }
}

如您所见1.and 2. 正在提供注入和所需的管道以将嗅探器与其在 "Process" class 内的委托连接起来。第 3 步只是调用所需的方法在进程线程外进行进一步处理。