Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Akka.NET和MVVM_C#_Akka_Castle Windsor_Akka.net_Akka Remote Actor - Fatal编程技术网

C# Akka.NET和MVVM

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&

我正在一个新的WPF.NET框架应用程序中使用Akka.NET

大多数情况下,在应用程序中使用actor的过程似乎是非常自我解释的,但是当涉及到在应用程序视图级别实际使用actor输出时,我有点卡住了

具体来说,在如何处理actor中的接收和处理事件方面,似乎有两个选项

  • 使用公开的事件处理程序创建参与者。所以可能是这样的:

    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);
        }
    }
    
  • 通过这种方式,我可以直接在actors本身(实际上是我的视图模型)中处理actor事件

    我尝试这样做时遇到的问题是正确配置Ioc(Castle Windsor)以正确构建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;
                    }))
    
    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);
        }
    
    }