【问题标题】:How to deal with instantiated dependencies?如何处理实例化的依赖关系?
【发布时间】:2021-08-10 17:02:54
【问题描述】:

处理实例化的依赖关系。

所以一个普遍的问题: 如何处理实例化的依赖关系?

假设我有两个功能:

public class Manager : ScriptableObject
{
    private var data;
    private void GetDataFromTextAsset() => data = BuildData();
    public bool IsValidInput(var input)
    {
        if(data.SomeAspectIsTrue)
            return true;
        return false;
    }
}

还有:

public class User
{
    public void SomeFunction(var input)
    {
        if(_manager.IsValidInput(input))
            DoStuff();
    }  
}

解决这种依赖关系、解耦两个类、可扩展和可测试的正确方法是什么?

我想使用 Zenject,但我不确定这是否适合这个特定问题?

我也猜单身人士不在窗外?

【问题讨论】:

  • 我认为工厂将是要走的路。
  • 工厂将创建动态解析其依赖关系的实例,我认为情况并非如此。这将取决于如何使用User
  • @Franz Gleichmann 你能扩展一下吗?将 GetDataFromTextAsset() 放入工厂,如何将该实例分发给所有用户?
  • 是的,用一些示例代码回答
  • @rustyBucketBay 我的用户只需要访问管理器上的 IsValidInput() 方法,这取决于从文本资产构建的数据库,因此我希望管理器是单数的。跨度>

标签: c# unity3d design-patterns dependencies zenject


【解决方案1】:

对于Manager 是用作单例而不是可编写脚本的对象的类的情况,假设您的经理是需要在游戏对象中某个地方的单一行为,我会这样做:

public class Manager: MonoInstaller
{
    public override void InstallBindings()
    {
        InstallManagers();
    }
    
    void InstallManagers() {
        Container.Bind<Manager>().To<Manager>().FromPrefabInstance("Prefabs/scriptFolderName").AsSingle();
        //....bind other managers
    }
}

将安装程序附加到“MonoInstallers”部分中的SceneContext 脚本组件。 然后在你的User 班级:

public class User
{
    [Inject] private Manager _manager; //no need of constructor. Instance is passed in

    public void SomeFunction(var input)
    {
        if(_manager.IsValidInput(input))
            DoStuff();
    }  
}

你可以查看thisasset,还有githubdocumetation,相当不错。

【讨论】:

  • 如果经理是ScriptableObject? ^^ Tbh 在 OPs 案例中,它甚至不需要是MonoBehaviour,但可以是静态类..所以有点不清楚实际用例是什么^^
  • 作为ScriptableObject 的经理对我来说没有多大意义(是吗?),无论如何,在这种情况下,OP 可以创建一个像这样的类public class ManagerInstaller: ScriptableObjectInstaller&lt;ManagerInstaller&gt; 绑定到容器无论如何他可能需要在里面。
  • 关于单一行为,是的,这是我的猜测。无论如何,单例模式使实例静态,因此行为是等效的。另一方面,afaik,如果 OP 使用原始 c# 静态类作为管理器,则不应询问是否注入该依赖项,因为可以从任何地方访问静态类,所以我想我可以放弃这种情况: )
  • 好吧,不是;)因为这是我的观点..从 OP 的代码示例目前的样子来看,它可能是 static class 并且根本不需要任何引用 .. 特别是因为 @ 987654333@ 建议无论如何只有一个实例.. 在这种情况下,我也不明白为什么单例会不好^^
  • 同时将类设为静态且可从任何地方访问会导致紧密耦合且难以维护代码。 OP似乎关心的话题
猜你喜欢
  • 1970-01-01
  • 2015-05-11
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多