【问题标题】:How does one manage external resources in a SOLID way?如何以可靠的方式管理外部资源?
【发布时间】:2016-10-20 17:39:04
【问题描述】:

我目前正在做一个项目,我将一个外部文件解析为一个抽象对象,如下所示:

public interface IMapConverter
{
    IMap Convert(IMapFile file);
}

public interface IMapFile
{
    void Load(string filePath);
    string Json { get; }
}

我的计划是通过使用 IMapFile 实现并在该实现中创建 StreamReader 来抽象文件的加载。然后我会将其传递给 IMapConverter.Convert 方法。那会是正确的方法并保持可测试性吗?例如,将字符串直接传递给 IMapConverter 并在那里处理它是错误的吗?

【问题讨论】:

  • 不清楚。对我来说IMapFile 似乎是一个糟糕的抽象,因为Json 可能是一个实现细节。所有映射文件都只包含 json 吗? IMapConverter 的作用是什么?它只是将json字符串解析为Map吗?看起来你的抽象有点奇怪,你可能会受益于一个更明确的设计,它试图比使用不灵活的抽象更不灵活。您能否更详细地解释您要解决的问题?
  • 感谢您的评论。当然! IMapFile 将加载一个文件,该文件可能包含字符串或二进制数据或任何内容(我明白你现在的意思了)。 IMapConverter 将转换任何格式并将其解析为包含实际地图数据的 IMap 对象,然后将其传递给 MapRenderer。你会建议什么抽象?
  • 我需要更多信息来提出更好的抽象。 IMap 到底是什么?它是字典数据结构的一种形式,还是Map 是您所在领域的业务概念?这样的Map 会有多种实现吗? Map 的依赖关系是什么?创作过程复杂吗?您是否计划有多个转换器实现?转换器的作用是什么?
  • 从您的业务角度来看,将地图存储在文件中是否重要?为什么不只是有一个IMapRepositorymapRepsitory.save(map)mapRepository.findByName(someMapName)。然后你可以实现一个FileMapRepository。我也会摆脱IMap 接口。 Map 可能是一个实体,很少有同一种实体的多个实现,当你这样做时,你可能有一个基类并使用继承。 Map 也不应该在单元测试中被嘲笑,所以我认为拥有 IMap 接口没有用。
  • 是的,当然。重要的部分是从域的角度抽象地图保存在文件中。因此,存储库公共接口不应该有任何与文件相关的内容。显然,FileMapRepository 将不得不在内部处理此类事情,并且可能依赖于其他协作对象来执行此操作(例如,不同地图格式的解析器)。您可以使用 ISP 原理并拥有类似 ILoadMaps 而不是 MapRepository 的接口。这将使您最终能够拥有ISaveMaps

标签: c# testing abstraction solid-principles


【解决方案1】:

我认为按照您的建议进行操作没有问题,即让混凝土 IMapConverter 创建您的混凝土 IMapFile 的实例,因为它们都在您的应用程序的同一层上。

据我了解,规则是实现依赖接口的一个类可以“知道”另一个接口的实现,只要它们位于应用程序的同一层;一旦你在层之间工作,你想将你的依赖项,即你的具体实现注入到它下面的层中。

我一直在研究the onion architecture,我强烈推荐给任何希望创建松散耦合、高度可测试的应用程序的人。只要它们位于同一层,这种依赖关系就相互了解的概念在该站点上进行了讨论。

【讨论】:

  • 非常清楚!感谢您链接到洋葱架构,好好阅读!
  • 没问题,很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多