首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有任何.NET程序“正确”使用构造函数?

是否有任何.NET程序“正确”使用构造函数?
EN

Stack Overflow用户
提问于 2009-05-29 15:41:03
回答 8查看 544关注 0票数 7

这在概念上与我的问题这里有关。然而,我一直在玩NHibernate,并且意识到我问题的真正核心是什么。

在典型的OO设计中,为了正确地封装数据,将值传递给存储在数据成员(字段)中的对象的构造函数是一种常见的模式。那些不应该更改的值只公开了访问器(只读属性)。允许更改的对象同时具有访问器和修改器(读-写属性)。在我看来,适当的 O/RM应该尊重这些约定,并在创建对象时使用可用的构造函数。依赖于读写属性、反射或其他hackish (IMHO)方法seems...wrong。

是否有一个.NET O/RM解决方案可以做到这一点?

编辑

为了解决Praveen的问题,我知道有些项目具有选择构造函数的“默认”算法--例如,StructureMap总是使用参数最多的构造函数,除非您用自定义属性标记构造函数。我认为这是一个有效的办法来处理这种情况。也许,除了ORM之外,使用IoC容器还会提供我需要的解决方案--尽管在我看来,这并不是本质上不好的,但对于使用ORM来说,这似乎是不必要的额外步骤。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-06-01 16:32:26

我想我知道了!

感谢大家的投入,但我必须回答我自己的问题。我只是花了一个多小时来研究PoEAA目录,思考OO原则,并将其与对C#语言和.NET框架的深入思考结合在一起。

我想出的答案是,one需要使用构造函数解决不了问题,最终与构造函数本身没有关系。我是懒惰加载

基本上,如果不实现域类中的延迟加载(对于持久化、无知和灵活性来说,这是一个主要的no-no ),如果不对域类进行子类分类,就无法做到这一点。这个子类是NHibernate需要虚拟属性的原因。

我仍然认为使用构造函数而不是反射或其他方法填充父类的字段会更好(至少对于非集合.延迟加载确实有其位置),但我肯定看到了no-arg构造函数的位置。

票数 1
EN

Stack Overflow用户

发布于 2009-05-29 15:55:11

我认为大多数ORM实际上支持这个概念,至少DataObject.Net支持这个概念。此代码如预期的那样工作:

代码语言:javascript
运行
复制
[HierarchyRoot(typeof(KeyGenerator), "Id")]
public class Message : Entity
{
  [Field]
  public int Id { get; private set; }

  [Field(Length = 100)]
  public string Text { get; private set; }

  public Message(string Text)
  {
    Text = text;
  }
}

编辑: DataObjects将数据存储在内部事务状态,并使用PostSharp生成的特殊物化构造函数。当然,如果ORM使用poco对象,也不是那么简单。

票数 3
EN

Stack Overflow用户

发布于 2009-05-29 15:55:10

不幸的是,如果不以某种方式标记构造函数,在.NET中这是不可能的。

为程序集元数据中的每个构造函数存储的方法签名仅包含构造函数的每个参数的类型。任何.NET ORM都不可能真正知道使用哪个构造函数。ORM看到的都是这样的东西:

代码语言:javascript
运行
复制
.ctor()
.ctor(string, string)
.ctor(string, string, string)

ORM无法知道哪个.ctor参数对应于客户对象的FirstName、LastName和MiddleName。

为了提供这种支持,.NET ORM必须支持读取您为每个参数定义的自定义属性。您需要像这样标记构造函数:

公共客户(属性(“FirstName”)字符串FirstName,属性(“LastName”)字符串LastName,属性(“MiddleName”)字符串MiddleName)

这有两个缺点:

  1. 没有办法(我可以想到,可能有人会纠正我),这可以进入一个映射文件。
  2. 您仍然需要编写与以前一样的映射,因为ORM仍然需要能够为每个属性获取单独的值。

因此,您需要做所有这些额外的工作,标记构造函数,同时,您仍然需要像以前一样映射您的类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/926668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档