C# 值对象是否是DI设计模式的有效依赖项?

C# 值对象是否是DI设计模式的有效依赖项?,c#,java,design-patterns,dependency-injection,C#,Java,Design Patterns,Dependency Injection,对于我看到的所有DI示例,我总是将依赖项视为其他类,如服务。但是一个对象可能在很大程度上和/或实际上至关重要地依赖于配置值,例如字符串和资源包装器(文件/路径/URI/URL,而不是整个大值字符串/文档或读取器) 注意,这仅仅是关于Java或C#语法中的DI设计模式,而不是任何特定DI框架如何处理此问题 例如,假设我有一个类,它返回一个字符串(相对路径,基于一些模糊的实现逻辑)。它(而是它的各种实现者)对“projectLocation”具有配置/初始化依赖性,因为用户可以在其机器上拥有各种项目

对于我看到的所有DI示例,我总是将依赖项视为其他类,如服务。但是一个对象可能在很大程度上和/或实际上至关重要地依赖于配置值,例如字符串和资源包装器(文件/路径/URI/URL,而不是整个大值字符串/文档或读取器)

注意,这仅仅是关于Java或C#语法中的DI设计模式,而不是任何特定DI框架如何处理此问题

例如,假设我有一个类,它返回一个字符串(相对路径,基于一些模糊的实现逻辑)。它(而是它的各种实现者)对“projectLocation”具有配置/初始化依赖性,因为用户可以在其机器上拥有各种项目,并且该类将在调用时基于给定项目执行一些逻辑

public abstract class PathResolver {

    protected File projectFilesLocation;

    public RoutinePathResolver(File projectFilesLocation) {
        this.projectFilesLocation = projectFilesLocation;
    }

    public abstract String getPath(String someValue);
}

我并不是仅仅为了单元测试而使用DI(gasp,我甚至不是现有项目的单元测试)。我只想将依赖关系/创作关注点和逻辑关注点分开。

如果要注入的东西(例如文件位置)是类直接使用的东西,那么注入它是完全有效的


对于
对象
,例如
文件
字符串
,这与所谓的服务没有什么不同。它是类的依赖项,因此DI适用。

但另一方面,可以插入ConfigurationSettings接口,该接口执行返回所述字符串值的服务?可能来自repo、配置文件或其他文件。这是有区别的。你可以这样做,但是配置设置界面最终会变成一个上帝对象,你最终会得到依赖它的一切。最好将每个类所需的特定配置直接注入其中。如果您希望以不同的方式加载文件,您可能需要一个
FileProvider
接口,例如
CMSFileProvider
LocalSystemFileProvider
实现。这取决于具体情况。有一个具体的配置是非常好的。例如
PathResolvedConfig
。当且仅当它专门携带特定类(或接口,显然)的配置数据时。只有一部分数据被使用的
ApplicationConfig
VO肯定是一个不好的点Creynders,如果config类具有足够高的内聚性,那么它就不是问题,通常会使生活更轻松。我倾向于对此和参数对象模式使用相同的经验法则。如果有3个以上的值,则封装在VO中。