首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Akka.NET和MVVM

Akka.NET和MVVM
EN

Stack Overflow用户
提问于 2019-11-24 08:02:17
回答 1查看 331关注 0票数 2

在我目前正在开发的一个新的WPF Akka.NET框架应用程序中,我正在使用.NET。

大多数情况下,在应用程序中使用参与者的过程似乎是很有自我解释的,然而,当涉及到在应用程序视图级别实际使用参与者输出时,我有点卡住了。

具体来说,关于如何处理参与者中的接收和处理事件,有两个选项。

  1. 使用公开的事件处理程序创建一个参与者。也许是这样的:

公共类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”模型,我不确定这种方法的并发性意味着什么。

  1. 的另一种选择似乎实际上是让我的ViewModels本身成为演员。所以基本上我有这样的东西。

公共抽象类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对象

代码语言:javascript
复制
        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参与者的最佳方法,特别是在处理接收到的消息和处理输出时。

EN

回答 1

Stack Overflow用户

发布于 2019-11-24 13:08:31

下面是我正在使用的解决方案,希望有人能提出一些更好的建议。

基本上,我已经放弃了让我的视图成为参与者的尝试,目前我决定使用一个接口在ViewModelActor之间进行通信。

当前的解决方案如下:

代码语言:javascript
复制
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输出提供一些更好的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59015721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档