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();
}
}