在Akka.Net中嵌入依赖注入

时间:2018-02-28 15:31:08

标签: c# .net dependency-injection akka.net

我们知道Akka.Net已经有一些DI功能,所以例如创建子actor我们可以写:

system.ActorOf(system.DI().Props<TypedWorker>(), "Worker1");

然而,Akka.Net解决方案是有限的。我的问题是你如何处理Akka中的范围依赖?已经有proposal这样但尚无工作。

让我们说我们有很多名为 Car 的演员,每辆车都有相当复杂的儿童演员等级。每辆车都有一些名为 CarDetails 的数据类,但在整个儿童演员层次结构中,他们中的一些人也希望能够访问 CarDetails 。问题是如何将 CarDetails 作为链接到Car的范围依赖关系,以便汽车的孩子可以在construtors中请求这种依赖?

您在当前的Akka.Net实施中使用了什么方法来解决此类问题?

1 个答案:

答案 0 :(得分:1)

这是问题,您无法使用现有的依赖注入框架解决问题 - 原因很简单,DI容器主要是为上下文敏感信息不具备的服务创建的存在(因为它在动态环境中不可扩展,在任何给定时间都有数千到数百万种不同的上下文)。

鉴于CarDetails 不可变只读:您只需将其作为构造函数参数发送给子actor即可。

如果CarDetails 不可变但不是readonly(即它可以由父级更新):您可以从构造函数param开始,然后扩展子代的行为以处理{ {1}}消息,由更新actor发送,用新的状态替换旧状态。

最后,如果CarDetailsUpdated 可变:只需将每个子实际需要的部分切换为不可变消息/构造函数参数,并执行上述更新。

这是一项原则的一部分,称为通过共享进行沟通,通过沟通进行分享。它只是意味着不尝试在actor之间共享可变状态(因为这会违反线程安全并需要锁定,而actor需要解决),而是复制或提供状态的一部分的不可变快照并将其发送给每个actor。这是演员模型编程的重要组成部分。