我正在为.Net搜索一个轻量级的Event Aggregator,我偶然发现了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容器应该自动创建它的实例并使用它来处理消息。但是,在这种情况下,由于订阅机制,我必须在发布消息之前创建一个实例。
我想我错过了一些关于Event Aggregates的关键点,你能告诉我我错过了什么吗?
答案 0 :(得分:0)
使用TinyIoC
作为DI容器。它适用于信使,并将为您创建信使。要使用它,必须安装TinyIoC
nuget,打开添加到项目中的文件,并在文件的#define TINYMESSENGER
区域取消注释Preprocessor Directives
。
现在您可以使用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();
}