2011-07-17 63 views
2

L2SQL使用默认的无参数构造函数生成实体。这是不能改变的,因为它需要物化对象。LINQ2SQL实体构造函数约束

但是,如果我的对象只能创建与某些值初始化我将如何去隐藏无参数构造函数,以便消费者只看到一个构造函数的参数?

1)我可以创建另一个同名部分类,并添加我的新构造函数,但消费者现在只需要两个选项来创建我的类的实例。无参数的构造函数仍然可见。

2)使用接口。创建一个定义构造函数的接口是不可能的。

人们怎么看待这个问题,因为它看起来像一个会发生很多问题。

+0

另一种情况是,提供的用于linq-to-sql的代码生成工具无法承受L2S的真正威力。真的感觉微软希望每个人都离开L2S。 –

回答

1

如果我理解你正确,你想阻止其他用户从类的构造函数构造一个,但仍然允许Linq2SQL使用它(因为它必须这样做)。

幸运的是,当你说默认的无参数构造函数不能被改变时,你错了。如果您将Linq2SQL实体类的构造函数更改为private,那么Linq2SQL将使用反射来调用它,如果使用了反射,则可以调用私有构造函数。 (顺便说一句,对构造函数的其他更改也可以使用Linq2SQL完成)。

当然,该类的其他用户也可以使用反射来调用该私有构造函数并创建一个私有状态的类,但是所有.NET类都是如此(事实上在其他地方也适用 - 例如,它通常不是很难篡改C++类的隐私,尽管这两种方法都没有独立于实现的保证)。但是,然后几乎总是可以使用反射来混淆课程;封装是一种确保正确性的机制,而不是安全性。 (但是关于哪些代码可以使用反射的安全限制,然后在较少的保证之上构建安全性)。

+0

是否有可能将由图形化ORM设计器或SqlMetal生成的默认ctor更改为私有,还是需要手动编码实体类? –

+0

我从来没有用过它们,所以我不知道。你当然可以用它们作为起点,然后手动编辑输出。缺点是你不能再从它们重建,但是如果你让这些类对其他代码可见,那么无论如何你都不能从它们重新编译,因为这可能导致破坏其他代码的工作。 –

+0

这对Jon很有帮助。我从来没有想过改变L2S生成实体的访问修饰符,因为我认为L2S已经设置了它需要执行其底层操作所需的那些实体的可访问级别。 L2S产生的评论让我不得不改变!即/ /更改此文件可能会导致不正确的行为,如果代码重新生成将丢失。 - 再生我可以应付。欢呼声 – FuzzyFrog