如何在DI Container中使用TinyMessenger(Event Aggregator)

时间:2015-11-12 04:14:15

标签: c# structuremap eventaggregator

我正在为.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的关键点,你能告诉我我错过了什么吗?

1 个答案:

答案 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();
}