gpt4 book ai didi

.NET ORM、不可变值对象、结构、默认构造函数和只读属性

转载 作者:行者123 更新时间:2023-12-04 12:56:13 26 4
gpt4 key购买 nike

我刚刚开始使用 .NET ORM,甚至还没有在 Entity Framework 和 NHibernate 之间做出决定。但是在这两种情况下,我都遇到了一个问题,他们似乎希望我以各种方式损害我的域模型的完整性,尤其是在 C# 对象设计的更精细点上。这是有关该主题的几个问题之一。

我非常习惯于使用如下所示的模式对适当的属性强制执行不变性:

public class Foo
{
private readonly string bar;
public string Bar { return this.bar; }

public Foo(string bar)
{
this.bar = bar;
}
}

NHibernate 或 Entity Framework 似乎不支持这一点。他们想要默认构造函数和 public二传手;它甚至出现 private setter (和默认构造器)工作(有时?)因为 ORM 可以使用反射。

我想我可以通过使用 private 来解决这些问题二传手和 private默认构造函数。至少公共(public) API 没有受到损害。只是我正在修改所有类的实现以添加未使用的 private构造函数,并且必须信任他理解的 future -Domenic private在我的二传手上真的意味着“除了在构造函数中之外不要调用我”。持久层正在泄漏到我的域对象设计中。

这似乎也没有必要——为什么 ORM 不知道使用非默认构造函数?也许他们能够做到,而我只是没有找到正确的博客文章来解释如何。

最后,在某些情况下,我的不可变值对象实际上非常适合(不可变)值类型,即 struct s。我的猜测是这是可能的,因为在数据库中,我的结构的字段将显示在存储父实体的同一行中。你能确认/拒绝吗? This blog post看起来很有希望,因为它给出了肯定的答案,但是代码的数量(实际上是特定于所讨论的值类型)令人震惊。

令人沮丧的是,在阅读了诸如 Effective C# 之类的书籍或 Eric Lippert 之类的博客(它们为如何设计富有表现力和防弹的 C# 对象提供了很好的建议)之后,使用 ORM 的需要让我把很多知识抛在了脑后。 window 。我希望这里有人能指出我错在哪里,无论是在我对他们能力的掌握中,还是在我对域建模和 ORM 角色的思考中。

最佳答案

正如评论所指出的,当/如果您采用 ORM 时,您将不得不做出一些妥协。在我看来,要记住的是,生产力的 yield 远远超过了这些妥协的“成本”。

我确实想向您指出(因为您是 EF 新手)您可以 customize the T4 templates生成 EF 实体和上下文。我想如果你玩这个,你可以消除大部分你不喜欢的东西。

关于.NET ORM、不可变值对象、结构、默认构造函数和只读属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5364612/

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