LINQ2SQL实体构造函数约束



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

然而,如果我的对象只能在初始化某些值的情况下创建,我该如何隐藏无参数构造函数,以便消费者只能看到带参数的构造函数?

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

2)使用接口。不能创建定义了构造函数的接口。

人们如何处理这个问题,因为它看起来像一个经常发生的问题。

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

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

当然,类的其他用户也可以使用反射来调用私有构造函数并创建一个处于私有状态的类,但这对所有。net类都是如此(并且确实适用于其他地方-例如,篡夺c++类的隐私通常并不难,尽管两者都没有独立于实现的保证)。但是用反射来搞砸一个类几乎总是可能的;封装是一种确保正确性而非安全性的机制。(但是对哪些代码可以使用反射的安全限制会在更少的保证之上构建安全性)。

最新更新