我正在寻找一种方法来创建一个具有默认公共构造函数的类,但这禁止它在反射之外使用。
更详细地说,我正在使用一个对象持久性框架(AWS DynamoDB - 我没有更改的选项),它要求对象实现这样的公共默认构造函数。该框架还要求所有持久化字段和属性也具有公共 get 和 set 访问器,并在创建和初始化新对象实例时使用它们。这会导致问题,因为访问器需要服务于双重目的——它们在被框架使用时需要“裸露”,但在被代码使用时需要强制限制和验证。无论如何,我已经解决了这部分问题,但它依赖于永远不允许代码使用默认构造函数(持久性框架使用的构造函数)构造持久化对象。
回到最初的问题 - 为了使这一切正常工作,我需要禁止代码使用默认构造函数,同时仍使其可供持久性框架使用(仅搜索空的公共构造函数)。我开始使用静态标志并在任何潜在的对象持久性使用之前和之后设置它,如果未设置,则在默认构造函数中抛出异常,但这开始在多线程环境(Web服务器)中引起问题)。一个线程会将它设置为供持久性框架使用,这将打开构造函数供其他线程使用。我还尝试了一个 ThreadStatic 标志,但它有阻止框架构建的相反问题,因为它有时会产生工作线程。
现在我想知道是否真的有办法做到这一点。在这一点上,它变得更像是一种好奇心而不是一种要求。我总是可以按照“不要使用这个构造器”的方式写一个评论,但是直接执行规则会让我感觉更好。我以前使用过 PostSharp,也许有一种方法可以使用方面进行编译时验证,以防止使用基于代码的默认构造函数?还有其他建议吗?