C# Akka.NET和MVVM
我正在一个新的WPF.NET框架应用程序中使用Akka.NET 大多数情况下,在应用程序中使用actor的过程似乎是非常自我解释的,但是当涉及到在应用程序视图级别实际使用actor输出时,我有点卡住了 具体来说,在如何处理actor中的接收和处理事件方面,似乎有两个选项C# Akka.NET和MVVM,c#,akka,castle-windsor,akka.net,akka-remote-actor,C#,Akka,Castle Windsor,Akka.net,Akka Remote Actor,我正在一个新的WPF.NET框架应用程序中使用Akka.NET 大多数情况下,在应用程序中使用actor的过程似乎是非常自我解释的,但是当涉及到在应用程序视图级别实际使用actor输出时,我有点卡住了 具体来说,在如何处理actor中的接收和处理事件方面,似乎有两个选项 使用公开的事件处理程序创建参与者。所以可能是这样的: public class DoActionActor : ReceiveActor { public event EventHandler<EventArgs&
public class DoActionActor : ReceiveActor
{
public event EventHandler<EventArgs> MessageReceived;
private readonly ActorSelection _doActionRemoteActor;
public DoActionActor(ActorSelection doActionRemoteActor)
{
this._doActionRemoteActor = doActionRemoteActor ?? throw new ArgumentNullException("doActionRemoteActor must be provided.");
this.Receive<GetAllStuffRequest>(this.HandleGetAllStuffRequestReceived);
this.Receive<GetAllStuffResponse>(this.HandleGetAllStuffResponseReceived);
}
public static Props Props(ActorSystem actorSystem, string doActionRemoteActorPath)
{
ActorSelection doActionRemoteActor = actorSystem.ActorSelection(doActionRemoteActorPath);
return Akka.Actor.Props.Create(() => new DoActionActor(doActionRemoteActor));
}
private void HandleGetAllStuffResponseReceived(GetAllTablesResponse obj)
{
this.MessageReceived?.Invoke(this, new EventArgs());
}
private void HandleGetAllStuffRequestReceived(GetAllTablesRequest obj)
{
this._doActionRemoteActor.Tell(obj, this.Sender);
}
}
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;
}))
Classes.FromThisAssembly()
.BasedOn()
.Configure(config=>config.UsingFactoryMethod((内核、组件模型、上下文)=>
{
var props=props.Create(context.RequestedType);
var result=ActorManager.Instance.System.ActorOf(props、context.RequestedType.Name);
返回结果;
}))
这在实际创建IActorRef
实例方面非常有效,但不幸的是,我无法将actor引用转换回我需要的实际对象(在本例中为BaseViewModel
)
所以,如果我尝试这样做返回(BaseViewModel)结果代码>我得到一个无效的强制转换异常。这显然是有道理的,因为我得到的是一个IActorRef
对象,而不是BaseViewModel
最后,我希望得到两个问题的答案
在MVVM应用程序中处理Akka.NET参与者的最佳方法是什么,特别是在处理接收到的消息和处理显示输出时
是否有一种方法可以正确配置我的Ioc系统,以创建一个IActorRef
实例并将其添加到系统中,但返回一个实际父actor对象的实例,具体实现BaseViewModel
下面是我目前使用的解决方案,希望有人能提出更好的建议
基本上,我已经放弃了让视图成为参与者的尝试,现在决定使用一个接口在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);
}
}
公共类MainWindowViewModel:BaseViewModel,ITableResponseHandler
{
公共无效处理响应(IEnumerable allenties){}
}
公共接口ITableResponseHandler
{
无效HandlerResponse(IEnumberable allenties);
}
公共类MyActor:ReceiveActor
{
公共MyActor(ITableResponseHandler视图模型)
{
this.Receive(this.handleGetAllenties Responsed);
}
私有void HandleGetAllenties ResponseReceived(GetAllTablesResponse对象)
{
此._视图模型可处理响应(对象结果);
}
}
虽然我觉得这并不理想,但它基本上让我避免了让我的视图模型本身成为参与者的所有额外复杂性,同时充分地将参与者与视图分离
我希望其他人也遇到过这个问题,并且可能能够提供更好的解决方案,以便在MVVM应用程序中处理Akka.NET输出。我对Akka.NET
没有经验,但参与者不是可注入的?有没有一种方法可以通过构造函数injectoin将所需的参与者注入ViewModel?谢谢您的输入。注入actor的问题在于,如果采用这种方法,显然您正在创建一个单例,并且实际上订阅了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);
}
}