我现在只使用MassTransit(和SOA)大约2周了,我到目前为止都喜欢它,但我正在努力让一些概念转移到精神上,也许我只是在想它完全是错误的办法。我的公司有一个遗留应用程序,每个数据库策略使用一个tenent,我无法改变。我已经想出如何让NHibernate使用tenent键来处理它,更不用说了。无论何时我想访问数据库,我都必须提供这个tenent密钥才能获得正确的会话工厂(来自IoC容器)。
我们开始采用更“传统”的方法,通过在我们的WebAPI项目中使用Request-Reply模式,将我们的数据访问和业务逻辑引入提供MassTransit连接的服务。该项目使用OAuth2进行身份验证,因此用户身份在控制器的User属性中可用,我们还存储了tenent密钥。
我的第一个想法是将线程上的CurrentPrincipal设置为User属性中的ClaimsPrincipal,但只为WebRequest线程设置它。然后我意识到我创建的每个Consumer / Activity也可能在他们自己的线程中。很容易将最小的数据添加到RequestClient的头部,以便第一个Consumer拥有它并创建中间件以自动检索它并重新创建ClaimsPrincipal(虽然这是不可能的,但是没有序列化)。但是,如果该Consumer创建了RoutingSlip,则不会将标头传递给它,因此没有任何活动能够使用类似的中间件。
最理想的是,我希望我的授权数据与链中的所有消息相关联,直到给出了回复,但我似乎无法找到任何我想在任何地方做的事情的例子,这就是为什么我我想我可能会错误地思考这个问题。除此之外,能够将IoC用于所有相关消息也很酷。我宁愿不必为消费者/活动制作消息数据的authroization数据部分,因为这会产生更多的失败点。
有人能指出我这么做的正确方向吗?