MVC like approach for 2d games vs Entity approach?

Hi all. Suppose we have a 2d game (it often uses unity UIs). For example to register a user, the game has a register panel:
IRegister interface, CRegister class that implements logics(send/receive data to/from the server) , CTestRegister class that implements fake server (send/receive data to/from the fake server) to test other implementations, CRegisterView.
My view classes are views/controllers and logic classes are models.
My question is that I often think about which section of my codes are placed inside logic or view, for example after registering I want to activate another gameobject and deactivate this panel or etc. (view is only unityUIs or all gameobjects, colliders,monobehaviours?)
note: My UIs doesn’t change (I use only unity UIs).
note: I need to test other sections of the game when I don’t access to server (So I send/receive fake data)
Can I Have a generic model/view for all panels:
logic(for example send/receive data to/from the server/ connect to dataset/userinfo …) in nonmonobehaviour classes and view (for example all monobehaviour components) in monobehaviour classes that have logic classes inside of themselves.
and finally I know MVC is not good enough for games but I think I can use them for menus,panels.,

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public interface IRegister {
    void Register(string _username, string _password);
    void AddEventListener();
    void RemoveEventListener();
    System.EventHandler<System.EventArgs> OnRegisteredEvent { get; set; }

}
public class CTestRegister : IRegister {
    public System.EventHandler<System.EventArgs> OnRegisteredEvent { get; set; }
    public CTestRegister() {
    }
    public void AddEventListener() {
        CEventManager.GetInstance().AddEventListener("Register", OnRegistered);
    }
    public void RemoveEventListener() {
        CEventManager.GetInstance().RemoveEventListener("Register", OnRegistered);
    }
    public void Register(string _username, string _password) {
        OnRegistered(this,new RegisterEventArgs());

    }
    void OnRegistered(object _sender, RegisterEventArgs _e) { //event function from server to client(recieved packet)
        // do something
        PlayerPrefs.SetString("Player", JsonUtility.ToJson(_e));
        OnRegisteredEvent(this,new System.EventArgs());
    }
}
public class CRegister : IRegister {
    public System.EventHandler<System.EventArgs> OnRegisteredEvent { get; set; }
    public CRegister() {
    }
    public void AddEventListener() {
        CEventManager.GetInstance().AddEventListener("Register", OnRegistered);
    }
    public void RemoveEventListener() {
        CEventManager.GetInstance().RemoveEventListener("Register", OnRegistered);
    }
    public void Register(string _username, string _password) {
        string jsonStr = JsonUtility.ToJson(new RegisterSentPacket(_username, _password));
        CServerMenager.GetInstance().SendRequest(jsonStr);//send to network
    }
    void OnRegistered(object _sender, RegisterEventArgs _e) { //event function from server to client(recieved packet)
        // do something
        PlayerPrefs.SetString("Player", JsonUtility.ToJson(_e));
        OnRegisteredEvent(this, new System.EventArgs());
    }
}
public class CRegisterView : MonoBehaviour {
    IRegister m_register;
    [SerializeField]
    InputField m_username;
    [SerializeField]
    InputField m_password;
    [SerializeField]
    GameObject newPanelObj;
    // Use this for initialization
    void Start() {
        m_register = new CRegister(); // can be changed to CTestRegister() but I need to recompile this code because of lacking depondancy injection!!
    }
    void OnEnable() {
        m_register.OnRegisteredEvent += OnRegistered;
        m_register.AddEventListener();
    }
    void OnDisable() {
        m_register.RemoveEventListener();
    }
    public void OnRegisterButtonClick() {
        m_register.Register(m_username.text, m_password.text);
    }
    void OnRegistered(object _sender, System.EventArgs _e) {
        CPanelManager.GetInstance().ChangePanel(newPanelObj);  // activate new panel and deactivate the old one
    }
}

If I don’t separate logics from views, I must reimplement all of them(contaning logics and views to test them).

or I can use entity approach. both logic and view are monobehaviour classes.

public class CTestRegister : Monobehaviour,IRegister {
}
public class CRegister : Monobehaviour,IRegister {
}
public class CRegisterView : Monobehaviour{
     IRegister register;
     void Start(){
          register=GetComponent<IRegiater>();
     }
}

I can use GetComponent to access CRegisterView inside CRegister/CTestRegister but to increase decoupling I selected events (OnRegistered event) Is it suitable?