回答を更新するように編集しました。
車のコレクションを含むレポジトリがあり、各車にはVINまたはREG番号(またはシリアル番号、またはシャーシ番号...車を一意に識別するもの)を持つことができます。
ID | VIN | REG
car1 | ABC | 123
car2 | DEF | 456
は、我々はまた、車のための状態とロジックをカプセル化し、永続的
CarActor
を持っています。
public class CarActor : PersistentReceiveActor
{
string _id;
public override string PersistenceId { get { return _id; } }
public CarActor(string id)
{
_id = id;
}
public static Props Props(string id)
{
return Akka.Actor.Props.Create(() => new CarActor(id));
}
}
我々は俳優名/永続 IDとして使用するために、単一の「真の名」が必要と俳優を再作成する際に、これらの「検索/参照が」持続、そのキーにちなんで名付けられた 俳優、自分自身です俳優のIDのみ 参照してください。
これは正しい方法ですか?実際に俳優ではなく、プロキシだけである多くの俳優のようです。
簡素化するために、私たちは自動車が識別できるさまざまなID番号をカプセル化するメッセージを定義できます。このメッセージは、処理のためにActorシステムに渡すことができます。
public class CarCommand
{
public string Vin { get; private set; }
public string Reg { get; private set; }
}
Best practiceエンティティのドメインに責任があると、自身の俳優として各エンティティを表現することを選択上司やルータの俳優を持っていることです。この管理者はCarCommand
メッセージを受信し、VINまたはREGによって車のIDを調べ、メッセージを処理する子アクタを検索/作成することができます。
public class CarSupervisor : ReceiveActor
{
//in reality this would be a repository e.g. a DB context... it would
//be even better if this was handled in another Actor that this Actor
//has access to
readonly IEnumerable<Cars> _cars;
public CarSupervisor(IEnumerable<Cars> cars)
{
_cars = cars;
Receive<CarCommand>(command =>
{
//find a car by VIN or REG or other variable
var car = _cars.First(c => c.VIN == command.VIN);
//see if any child actors have been created for this car instance
var child = Context.Child(car.Id);
//if we don't have an incarnation yet, create one
if (Equals(child, ActorRefs.Nobody))
child = Context.ActorOf(CarActor.Props(car.Id), car.Id));
//tell the child to process the message
child.Forward(command);
});
}
}
答えていただきありがとうございますが、あなたがその質問を理解しているかどうかはわかりません。この俳優にとって自然な鍵はありません。私はVIN、登録簿などでそれを見つけようとしている可能性があります。あらゆる参照(VIN、登録プレート)のために別個の俳優を持つこと以外に、これらのいずれかによって車を見つける方法はありますか?また、メモリリストには実現できません。 – jameswilddev
VINまたはRegは一意のキーではありませんか?例えば。 1つのVINは、私たちのレポジトリにIDを持つ1台の車にしか関連しません。 'IdSupplierActor'は、VINやRegなどを含むメッセージを受け取り、問題の車のIDを返します。あるいは、 'CarFinderActor'はメッセージを受け取り、' Actor'へのパスを返します。 –
これは私の言いたいことです。 Akka Persistenceを使ってどのように実装されますか?すべてのVINまたは登録番号が付いている俳優を雇うことは現実的ではありません。ありがとう。 – jameswilddev