在我目前正在开发的一个新的WPF Akka.NET框架应用程序中,我正在使用.NET。
大多数情况下,在应用程序中使用参与者的过程似乎是很有自我解释的,然而,当涉及到在应用程序视图级别实际使用参与者输出时,我有点卡住了。
具体来说,关于如何处理参与者中的接收和处理事件,有两个选项。
公共类DoActionActor : ReceiveActor {公共事件EventHandler MessageReceived;私有只读ActorSelection _doActionRemoteActor;public DoActionActor(ActorSelection doActionRemoteActor) { this._doActionRemoteActor = doActionRemoteActor ??抛出新的this.Receive(this.HandleGetAllStuffResponseReceived);(“必须提供doActionRemoteActor”);this.Receive(this.HandleGetAllStuffResponseReceived);}公共静态道具(actorSystem actorSystem,string doActionRemoteActorPath) { ActorSelection doActionRemoteActor= actorSystem.ActorSelection(doActionRemoteActorPath);返回Akka.Actor.Props.Create(() => new DoActionActor(doActionRemoteActor));}私有空HandleGetAllStuffResponseReceived(GetAllTablesResponse obj) { this.MessageReceived?.Invoke(this,新的EventArgs());}私有的EventArgs obj) { this._doActionRemoteActor.Tell(obj,this.Sender);}
因此,基本上,您可以通过执行类似于此_doActionActor.Tell(new GetStuffRequest());的操作来创建视图和调用任何调用,然后通过事件处理程序处理输出。这很有效,但似乎打破了Akka.NET鼓励的“Actors‘everywhere”模型,我不确定这种方法的并发性意味着什么。
公共抽象类BaseViewModel : ReceiveActor,IViewModel { public event PropertyChangedEventHandler PropertyChanged;公共抽象道具GetProps();受保护的RaisePropertyChanged(PropertyChangedEventArgs eventArgs) {this.PropertyChanged?.Invoke(此,eventArgs);}公共类MainWindowViewModel : BaseViewModel { public MainWindowViewModel() {ReceiveActor ActorManager.Instance.Table.Tell(new GetAllTablesRequest(1),this.Self);}公共覆盖Props GetProps() {返回Akka.Actor.Props.Create(() =>新的MainWindowViewModel());}私有的void MainWindowViewModel obj) { }
通过这种方式,我可以直接在演员自己中处理演员事件(这实际上是我的视图模型)。
当我尝试这样做时遇到的问题是正确地配置我的Ioc (Castle )以正确构建Akka.NET实例。
所以我有一些代码来创建如下所示的Akka.NET对象
Classes.FromThisAssembly()
.BasedOn<BaseViewModel>()
.Configure(config => config.UsingFactoryMethod((kernel, componentModel, context) =>
{
var props = Props.Create(context.RequestedType);
var result = ActorManager.Instance.System.ActorOf(props, context.RequestedType.Name);
return result;
}))这在实际创建IActorRef实例方面非常有效,但不幸的是,我无法将参与者引用转换回我需要的实际对象(在本例中为BaseViewModel)。
因此,如果我尝试执行这个return (BaseViewModel)result;,就会得到一个无效的强制转换异常。这显然是有意义的,因为我得到的是IActorRef对象,而不是BaseViewModel。
因此,最后,我希望得到两个问题的答案。
什么是处理MVVM应用程序中的BaseViewModel参与者的最佳方法,特别是在处理接收到的消息和处理输出时。
发布于 2019-11-24 13:08:31
下面是我正在使用的解决方案,希望有人能提出一些更好的建议。
基本上,我已经放弃了让我的视图成为参与者的尝试,目前我决定使用一个接口在ViewModel和Actor之间进行通信。
当前的解决方案如下:
public class MainWindowViewModel : BaseViewModel, ITableResponseHandler
{
public void HandleResponse(IEnumerable<Entity> allEntities) { }
}
public interface ITableResponseHandler
{
void HandleResponse(IEnumerable<Entity> allEntities);
}
public class MyActor : ReceiveActor
{
public MyActor(ITableResponseHandler viewModel)
{
this.Receive<GetAllEntitiesResponse>(this.HandleGetAllEntitiesResponseReceived);
}
private void HandleGetAllEntitiesResponseReceived(GetAllTablesResponse obj)
{
this._ViewModel.HandleTablesResponse(obj.Result);
}
}虽然我不认为这是理想的,但它基本上可以让我避免所有额外的复杂性,试图使我的视图建模自己的角色,同时充分地使参与者与视图脱钩。
我希望其他人已经遇到了这个问题,并可能能够为处理MVVM应用程序中的Akka.NET输出提供一些更好的解决方案。
https://stackoverflow.com/questions/59015721
复制相似问题