我们知道Akka.Net已经有一些DI功能,所以例如创建子actor我们可以写:
system.ActorOf(system.DI().Props<TypedWorker>(), "Worker1");
然而,Akka.Net解决方案是有限的。我的问题是你如何处理Akka中的范围依赖?已经有proposal这样但尚无工作。
让我们说我们有很多名为 Car 的演员,每辆车都有相当复杂的儿童演员等级。每辆车都有一些名为 CarDetails 的数据类,但在整个儿童演员层次结构中,他们中的一些人也希望能够访问 CarDetails 。问题是如何将 CarDetails 作为链接到Car的范围依赖关系,以便汽车的孩子可以在construtors中请求这种依赖?
您在当前的Akka.Net实施中使用了什么方法来解决此类问题?
答案 0 :(得分:1)
这是问题,您无法使用现有的依赖注入框架解决问题 - 原因很简单,DI容器主要是为上下文敏感信息不具备的服务创建的存在(因为它在动态环境中不可扩展,在任何给定时间都有数千到数百万种不同的上下文)。
鉴于CarDetails
不可变和只读:您只需将其作为构造函数参数发送给子actor即可。
如果CarDetails
不可变但不是readonly(即它可以由父级更新):您可以从构造函数param开始,然后扩展子代的行为以处理{ {1}}消息,由更新actor发送,用新的状态替换旧状态。
最后,如果CarDetailsUpdated
可变:只需将每个子实际需要的部分切换为不可变消息/构造函数参数,并执行上述更新。
这是一项原则的一部分,称为通过共享进行沟通,通过沟通进行分享。它只是意味着不尝试在actor之间共享可变状态(因为这会违反线程安全并需要锁定,而actor需要解决),而是复制或提供状态的一部分的不可变快照并将其发送给每个actor。这是演员模型编程的重要组成部分。