我正在寻找使用guice提供的一些对象来引导akka actor系统,并且我不确定如何在不使用icky静态提供程序的情况下执行此操作 .
具体来说,我已经配置了xstream来支持@Inject注释,这样当你反序列化文档时,程序员可以在表单中向其类添加一个字段
private @Inject transient SomeServiceObject someServiceObject;
这并没有经常使用,但在使用它真的很方便 .
这允许我们编写类似的模型对象
public class ComplexModelObject{
private List<List<Double>> matrix; //my domain has a lot of these.
//keeps stateful references to things like native fortran libraries (gasp! fortran!!)
//and other problematic-to-serialize state
//--can be constructed easily by guice though.
private transient @Inject ComplexMathyThing mathy;
public int getRank(){ return matrix.size(); }
public double getOtherObviousThing(){ return doObviousTransform(matrix); }
public double getRSigmaMachinaValue(){ mathy.doComplexTransform(matrix); }
}
问题是将其变成akka actor模型 . 我想提供akka这样的序列化程序,问题是序列化程序实例 - 出于显而易见的原因 - 依赖于一个注入器实例,如下所示:
public class AKKAXStreamXMLSerializer extends akka.serialization.JSerializer {
private final XStream serializer;
public AKKAXStreamXMLSerializer(Injector injector){
this.serializer = OurSerializerFactory.buildConfiguredSerializerWith(injector);
}
@Override public Object fromBinaryJava(byte[] bytes, Class<?> manifest) {
return serializer.fromXML(new ByteArrayInputStream(bytes));
}
@Override public int identifier() {
return 872391;
}
@Override public byte[] toBinary(Object o) {
return serializer.toXML(o).getBytes();
}
@Override public boolean includeManifest() {
return false;
}
}
这意味着我不能简单地在conf文件中给akka一个typename,因为它不知道如何解决该构造函数参数 .
查看akkas serialization documentation,他们没有提到以编程方式设置序列化程序,他们只提到通过conf文件配置它 . 看看akka源代码,我找不到任何对序列化器对象的引用或它们如何被解析,所以它看起来像是我的SOL .
是否有一些明显的API我不见了?我是使用静态提供程序找到所有这些东西的最佳策略吗?
编辑:我发现了两个有趣的前景:
-
那里有一个问题,但对于任何阅读此内容的人来说,you can take a look
-
有一个名为dyanmic access的类,配置文件解析代码用它来生成它的类 . 它是一个观察对象(因为缺乏一个更好的术语,它是通用工厂) . 它的记录就像是一个用户扩展点,但只有非常复杂的用户应该使用它 .
非常感谢akka专家的想法