在Akka.Net中嵌入依赖注入

问题描述 投票:1回答:1

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

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

但是Akka.Net解决方案是有限的。我的问题是你如何处理Akka中的范围依赖?已经有这样的proposal但还没有完成任何工作。

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

你在当前的Akka.Net实现中使用了什么方法来解决这个问题?

c# .net dependency-injection akka.net
1个回答
1
投票

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

鉴于CarDetails是不可变的和只读的:你可以简单地将它作为构造函数参数发送给子actor。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.