我目前正在 Build 一个结构为洋葱架构的简单MVC应用程序 . 为简单起见,假设我有以下项目(目前无视业务和数据库层):

  • Sample.Web - 这是ASP.NET MVC应用程序

  • Sample.Application - 包含应用程序服务 .

  • Sample.Infrastructure - 包含基础结构服务 .

目前,我正在使用Ninject(虽然这可能会改变) . 因此,使用Ninject MVC,我在启动时注册应用程序和基础结构服务,使用Sample.Web作为组合根 . Sample.Application中的应用程序服务被注入到控制器中,这很简单并且运行良好 .

但是,我遇到问题的方法是确定如何正确初始化MassTransit . 理想情况下,我希望有一个通用接口来包装 ConsumeContext 实例,并允许我设置事件 . 我似乎无法从Sample.Infrastructure中完全设置实例,因为基础结构不/不应该知道事件是什么 . 我假设消费者类应该存在于Sample.Application中,我认为基础设施不应该依赖于了解消费者 .

在启动时,System.Web将从每个System.Application和System.Infrastructure加载 NinjectModule . 这是否意味着System.Web应该具有消费者类的明确知识,以便它可以配置 IBusControl 实例,或者是否有更优雅的解决方案?

现在,我认为我要走的路径是Sample.Web将加载 NinjectModule 实例,然后我将在显式加载消费者之后从Application_Start配置 ConsumeContext . 但是,这意味着如果我添加消费者,我将不得不重建/重新部署Sample.Web,这不是理想的,而是我关注的根源 . 假设在Sample.Application中定义了消费者,并且Sample.Application中存在所有事件发布和订阅,则必须触摸Sample.Web或Sample.Infrastructure以添加消费者是代码味道 .

提前谢谢了 .

Edit

一如既往,在点击提交后,会想到其他的东西 . 我认为一种可能的解决方案可能是将Sample.Web作为已知 endpoints 的Sample.Application . 由于所有事件都将从Sample.Application发布和订阅,因此让Sample.Web在Sample.Infrastructure中创建实际实例并根据它从Sample.Application学到的内容组成 endpoints 是有意义的 .

不过,我对其他解决方案肯定是开放的 .