c# - 如何让一个类负责构建另一个类
问题描述
我正在编写一个类库,其中包含一个名为Application
. 该类Application
包含Document
对象的集合。我希望Application
该类在适当的时候单独负责“创建”(构造)Document
对象。我不希望我自己或我们的其他开发人员能够Document
任意构造新对象。
我试图想出一些强有力的方法来强制执行这一点,但我只提出了几种可能性,它们都有缺点。
第一种方法是将Application
类嵌套在类中Document
,并使Document
构造函数私有,以便只有Application
类可以访问它。但这在结构上毫无意义,实际上与真正的关系相反。更不用说通常不鼓励公共嵌套类。
我尝试的另一种方法是将Document
构造函数设为私有,但给它一个公共的“工厂方法”,它会进行一些检查以尝试确保它确实被Application
. 但是当我试图实现它时,这变得非常复杂。
我是否过于复杂了?当然,构建代码库以使开发人员可以做他们不应该做的事情是很常见的事情吗?我是否应该期望我们的开发人员(和我自己)使用谨慎和常识,而不是四处构建新Document
对象,而他们应该从中获取它们Application
?
还是我试图强制执行这一点是正确的?我是否正确地追求课程只能按预期使用?毕竟,这首先是访问级别的目的——仅在正确的上下文中强制使用实体。如果这是一个合理的追求,是否有人对在这种情况下如何做到这一点有任何建议?
注意:我发现了这个类似的线程:java - make class only instantiable from specific class。但是建议的解决方案是嵌套类,由于我上面给出的原因,这不是一个好的选择。
解决方案
有一种方法可以做到这一点,但它有点令人费解,我不会这样做......
您可以将Document
实现放在单独的程序集中并制作其构造函数internal
。
然后将该Application
类放在另一个程序集中(单独)并InternalsVisibleTo
在 Document 程序集中使用,以使Document
构造函数对程序集可见Application
。
这样,只有程序Application
集或程序集中的代码Document
才能构造一个Document
. (当然,这可以简单地通过向Application
程序集或Document
创建Document
...实例的程序集添加类来规避)
尽管我实际上并不希望Application
该类直接创建Document
. 我想Document
在一个类后面进行抽象IDocument
并传递一个工厂方法以Application
用于创建IDocument
项目。
推荐阅读
- php - Laravel 选择行有一列包含输入变量
- sql - 使用正则表达式提取不在方括号内的字符串模式
- javascript - 如何将excel单个单元格中的数据格式化为正确的列和行?
- android - Android Studio 3.5 在多个设备上运行应用程序
- java - 使用 Google drive api - java sdk - 如何获取按日期过滤的文件修订
- amazon-ec2 - 如何连接到具有防火墙保护的远程数据库
- hash - 当直接打开带有主题标签(锚链接)的网站时不起作用 - 在角度 6 中?
- php - 未验证电子邮件时处理电子邮件验证响应
- json - 将 Ruby 2.4.2 升级到 2.6.3 导致 JSON 错误
- python - MySQLdb connection.close() 在 Python 2.7 中不起作用