如何将TinyMessenger(事件聚合器)与DI容器一起使用

本文关键字:DI 一起 TinyMessenger 事件 | 更新日期: 2023-09-27 18:21:45

我正在为.Net搜索轻量级事件聚合器,无意中发现了TinyMessenger(https://github.com/grumpydev/TinyMessenger/wiki)。它似乎确实完成了我想要的工作,但我不知道如何将它与DI容器一起使用,例如我打算使用的Structuremap。

这是我的简单测试代码

class Program
{
    static void Main(string[] args)
    {
        var messageHub = new TinyMessengerHub();
        var salesMadeHandler = new SalesMadeHandler(messageHub);
        messageHub.Publish(new SaleMadeEvent() {Id = Guid.NewGuid(), Total = 100});
        Console.ReadKey();
    }
}
class SalesMadeHandler
{
    private readonly ITinyMessengerHub _messengerHub;
    public SalesMadeHandler(ITinyMessengerHub messengerHub)
    {
        _messengerHub = messengerHub;
        _messengerHub.Subscribe<SaleMadeEvent>(Handle);
    }
    public void Handle(SaleMadeEvent message)
    {
        Console.WriteLine("Message Recieved with ID: " + message.Id);
    }
}

正如您在上面的代码中看到的,我有一个SalesMadeHandler类,它订阅了它的构造函数中的事件。我所理解的是,我应该能够用接口标记这个类,DI容器应该自动创建它的一个实例,并使用它来处理消息。然而,在这种情况下,由于订阅机制,我必须在发布消息之前创建一个实例。

我想我在事件聚合中遗漏了一些关键点,你能告诉我遗漏了什么吗?

如何将TinyMessenger(事件聚合器)与DI容器一起使用

使用TinyIoC作为DI容器。它对信使很好,会为你创造信使。要使用它,必须安装TinyIoC nuget,打开添加到项目中的文件,并在文件的Preprocessor Directives区域中取消注释#define TINYMESSENGER

现在您可以使用TinyIoC来解析实例,DI容器将为您创建信使并将其传递给处理程序。。。

static void Main(string[] args)
{
    var salesMadeHandler = TinyIoCContainer.Current.Resolve<SalesMadeHandler>();
    var messageHub = TinyIoCContainer.Current.Resolve<ITinyMessengerHub>();
    messageHub.Publish(new SaleMadeEvent() { Id = Guid.NewGuid(), Total = 100 });
    Console.ReadKey();
}