gpt4 book ai didi

c# - 固体 : Same-class constructor call allowed?

转载 作者:行者123 更新时间:2023-11-30 17:59:36 27 4
gpt4 key购买 nike

真正 SOLID 代码的一个重要特性是,构造函数调用并不经常发生在实际应用程序代码中,而是主要发生在必要时的组合根和工厂方法中。这对我来说很有意义,我会尽我所能坚持这一点。

我创建了一个简单的类,在我看来,偏离上述规则不仅是允许的,而且实际上是正确的。这抽象了一些简单的注册表查询,以方便对其他一些代码进行单元测试:

public class RegistryKeyProxy : IRegistryKey
{
private RegistryKey registrykey;

public RegistryKeyProxy(RegistryKey registrykey)
{
this.registrykey = registrykey;
}

public IRegistryKey OpenSubKey(string subKeyName)
{
var subkey = this.registrykey.OpenSubKey(subKeyName);

return (null == subkey ? null : new RegistryKeyProxy(subkey));
}

public IEnumerable<string> GetSubKeyNames()
{
return this.registrykey.GetSubKeyNames();
}

public object GetValue(string valueName)
{
return this.registrykey.GetValue(valueName);
}
}

OpenSubKey() 方法实际上在不使用工厂的情况下创建了同一个类的实例,但是由于注册表呈现的封闭概念,我实际上似乎希望不返回 任何看起来像注册表项,但实际上与当前对象的工作方式完全相同的东西。

我知道最终我想要工作的 SOLID 程度取决于我,但我想知道这是否通常是一条可行的道路,因为基本概念的性质,或者这是否是不是规则的异常(exception),而是严重的违规行为。

最佳答案

你说的是 Dependency Inversion principle .这个原则并没有说你根本不应该新建对象,但它区分了两种类型的对象。实现行为的对象(服务)和包含数据的对象(DTO、值类型、实体)。

不更新 DTO 是相当愚蠢的,因为没有要抽象的行为。它们只包含数据。 (就像将 IPerson 接口(interface)添加到 Person DTO 一样愚蠢)。

Miško Hevery 称它们为 injectables and newables ,这是一个很好的术语。

有关详细信息,请参阅此 Stackoverflow 问题:Why not use an IoC container to resolve dependencies for entities/business objects?

关于c# - 固体 : Same-class constructor call allowed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11023579/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com