使用 Unity 作为 IoC 的 Rebus Servicebus

Nor*_*sen 2 c# dependency-injection unity-container servicebus rebus

我有几个 Rebus 新手入门问题。Rebus ReadMe 文件中所有不错的示例都使用了 Windsor Castle,但我没有那个选项;相反,我必须使用 Unity。

我的第一个挑战是为 Unity IoC Container 找到合适的适配器,如示例所述:

var someContainerAdapter =
    new AdapterForMyFavoriteIocContainer(myFavoriteIocContainer);
Run Code Online (Sandbox Code Playgroud)

我终于在这里找到了一些似乎可以完成这项工作的代码,但也许存在更好的容器,因为我必须自己实现IContainerAdapter接口(我想知道是否需要......)。

但我可以忍受...

我的下一个问题更糟,我还没有发现。在 Rebus 入门示例中,以下内容用于向 IoC 容器添加处理程序:

container.Register(
    Component.For<IHandleMessages<DateTime>>()
    .ImplementedBy<PrintDateTime>());
Run Code Online (Sandbox Code Playgroud)

以上是 Windsor Castle 语法,我不知道 Unity 语法应该如何用于相同的操作。所以我需要一些帮助。一个建议是,如果我能得到一个适用于 Unity 的小型解决方案的参考。

moo*_*000 5

我的建议是使用Rebus.Unity,它是 Rebus 的一个现成的 Unity 容器适配器,由一个很棒的 Rebus 贡献者制作。

有一个适用于它的 NuGet 包,因此您可以install-package Rebus.Unity(或以您的首选方式将 NuGet 包添加到您的项目中)。

现在,为了与统一登记处理程序,你应该知道的事实,即统一行为不同于所有其它容器那里关于ResolveAll行为(至少是那些我所了解的),它要求所有的处理程序都注册作为命名注册。

我不记得执行此操作的确切 Unity 语法,但我认为它看起来有点像这样:

container.RegisterType<IHandleMessages<SomeMessage>, MyMessageHandler>("id");
Run Code Online (Sandbox Code Playgroud)

为了注册MyMessageHandler为 的处理程序SomeMessage。各种注册函数还有其他几种重载,因此您应该能够找到适合您需求的重载 - 但请记住,对于 Unity,由于 Rebus 执行 a ResolveAll,您必须始终使用 key/id 注册处理程序。