如何将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容器应该自动创建它的一个实例,并使用它来处理消息。然而,在这种情况下,由于订阅机制,我必须在发布消息之前创建一个实例。
我想我在事件聚合中遗漏了一些关键点,你能告诉我遗漏了什么吗?
使用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();
}