unity3d 通用Unity MVP解决方案

bvhaajcl  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(193)

我正在寻找一些通用的解决方案来实现MVP的统一排序。我一直在一个项目之前,伙计们有很好的解决方案,但我不记得它是如何工作的。
所以我试着重现我记忆中的一切,但我意识到我不知道如何把所有的东西联系起来。按照我的逻辑,它应该是一种普遍的东西。就像一种资产,或者包,您可以直接添加到您的项目中,并在其上构建您自己的类,以便它们适合该模式。View基本上是GameObject,它处理所有UI或模块的任何可见部分。

I查看

public interface IView
    {
        public IPresenter Presenter { get; set; }

        public virtual void OnInit() { }
    }

IP报告者

public interface IPresenter
    {
        public IView View { get; set; }
        public Model.Model Model {get; set;}
    }

然后我开始实现View类。它应该继承自MonoBehaviour,以便充当游戏对象上的组件,并接收场景中其他对象的引用。例如,On Init方法是播放开始动画的完美位置。

视图

public class View : MonoBehaviour, IView
    {
        public IPresenter Presenter { get; set; }

        public void OnInit()
        {

        }
        private void Awake()
        {
            Presenter = new Presenter.Presenter(this);
        }
    }

Presenter不需要继承MonoBehaviour,因为它只是保存逻辑和操作数据。

演示者

public class Presenter : IPresenter
    {
        public IView View {get; set;}
        public Model.Model Model { get; set; }

        public Presenter(IView view)
        {
            Model = new Model.Model();
            Model.Presenter = this;
            View = view;
            View.OnInit();
        }

    }

型号

public class Model
    {
        public Presenter.Presenter Presenter { get; set; }
        public Model() { }
    }

目前我的Model类是空的,因为我最终意识到我不知道如何将View连接到Presenter。事实上,我确实连接了所有这些类。但是对我来说,所有的东西都依赖于视图似乎是错误的,因为它只是这个体系结构中一个依赖于Unity的类。也许我应该有不同的类来创建Model和Presenter的示例,并将它们分配给彼此。我不知道I don“我不知道怎样做才对。
我也开始在这个项目中使用命名空间,由于某种原因,我不能只使用Presenter或Model类。我必须使用Presenter.Presenter或Model.Model来代替。我做错了什么?这应该是一个常见的问题。
所以,如果你用过类似的东西之前告诉我,我的一般错误,阻止我完成这个简单的任务。也许你已经做了我正在寻找的解决方案。谢谢回复)

sgtfey8w

sgtfey8w1#

我强烈建议您看一看Zenject,这样您将有一个安装程序,它将示例化您的Presenter和Model,并将每个(和View)注入所需的类中。

public interface IView
{
}

public interface IPresenter
{
}

public interface IModel
{
}

public class View : MonoBehaviour, IView
{
    [Inject] private readonly IPresenter _presenter;
}

public class Presenter : IPresenter
{
    [Inject] private readonly IView _view;
    [Inject] private readonly IModel _model;
}

public class Model: IModel
{
    [Inject] private readonly IPresenter _presenter;
}

public class CustomInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        Container.Bind<IModel>().To<Model>().AsSingle();
        Container.Bind<IView>().FromComponentInParents();
        Container.Bind<IPresenter>().To<Presenter>().AsSingle();
    }
}

(Note我没有测试代码,我删除了逻辑以使其简单,并向您展示了Zenject在您的用例中的优势)
关于命名空间问题,要避免Presenter.Presenter,只需使用using语句,如下所示:using Presenter;

相关问题