Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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# 如何处理实例化的依赖关系?_C#_Unity3d_Design Patterns_Dependencies_Zenject - Fatal编程技术网

C# 如何处理实例化的依赖关系?

C# 如何处理实例化的依赖关系?,c#,unity3d,design-patterns,dependencies,zenject,C#,Unity3d,Design Patterns,Dependencies,Zenject,处理实例化的依赖项 因此,一个普遍的问题是: 如何处理实例化的依赖关系 假设我有两个功能: public class Manager : ScriptableObject { private var data; private void GetDataFromTextAsset() => data = BuildData(); public bool IsValidInput(var input) { if(data.SomeAspectIs

处理实例化的依赖项

因此,一个普遍的问题是: 如何处理实例化的依赖关系

假设我有两个功能:

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,但我不确定这是否适合这个特定问题


另外,我想单例是不存在的?

对于
管理器
是作为单例使用的类,而不是作为可编写脚本的对象,假设您的管理器是单例行为,需要在游戏对象中的某个位置,我会:

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

您可以检查资产和github,这非常好。

我认为工厂将是一个不错的选择。工厂将创建实例,并动态解决它们的依赖关系,我认为情况并非如此。这将取决于
用户的身份used@Franz格雷克曼,你能进一步说明吗?将GetDataFromTextAsset()放入工厂,如何将该实例分发给所有用户?是的,用一些示例回答code@rustyBucketBay我的用户只需要访问manager上的IsValidInput()方法,该方法取决于从文本资产生成的数据库,出于这个原因,我希望管理器是单数的。如果管理器是一个
ScriptableObject
?^^Tbh在OPs情况下,它甚至不需要是一个
单一行为
,但可以是一个静态类。。所以有点不清楚实际用例是什么^^^对于我来说,管理者成为
ScriptableObject
(是吗?),无论如何,在这种情况下,OP可以创建这样的类
公共类ManagerInstaller:ScriptableObjectInstaller
绑定到容器中他可能需要的任何内容。关于MonoBehavior,是的,这是我的猜测。无论如何,单例模式使intance是静态的,因此行为是等价的。另一方面,如果OP使用原始c#静态类作为管理器,那么afaik不应该询问注入这种依赖关系,因为静态类可以从任何地方访问,所以我想我可以放弃这种情况:)是的,不是的;)因为这是我的观点。。从OP的代码示例目前的外观来看,它可能是一个
静态类
,根本不需要任何引用。。特别是因为
Manager
表明无论如何只有一个实例。。在这种情况下,我也不明白为什么单例是不好的^^^同时使类是静态的,可以从任何地方访问,这会导致紧密耦合和难以维护的代码。OP似乎关心的话题
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();
    }  
}