我有很多实现相同接口(interface)的算法类;另一个“工厂”类负责通过配置参数实例化正确的算法类,然后调用该实例的启动方法。
我想将算法类的构造函数(或任何其他实例创建机制)的可见性仅限于工厂类。
我该如何解决这个问题?我能想到的唯一干净的解决方案是将这些类移动到不同的 .dll 中并将算法类更改为私有(private),但这不是我现在想要做的。
最佳答案
这不是您愿意听到的答案,但是:不要。
通过使该构造函数private/internal/protected
,您很难测试算法,并且您还阻止了 API 的任何使用者手动选择他们自己的实现而不是使用工厂。
我会说让构造函数公开,只需确保在构造函数中声明所需的每个依赖项即可。这是我对构造函数的各种修饰符的看法:
public
- 每个人都可以访问您的构造函数,并且您可以测试该类 - 这很好。protected
- 子类可以访问构造函数。这没问题,但只真正用于抽象类和/或构造函数链接。internal
- 您将构造函数的使用限制在InternalsVisibleTo
( friend )程序集中。这意味着您的程序集中的任何人都可以正常构造它,但其他程序集必须显式InternalsVisibleTo
或被强制使用您的工厂,从而将算法耦合到工厂.private
- 用于隐藏默认构造函数(尽管如果您创建至少包含一个参数的构造函数则不需要这样做),或仅创建可链接的构造函数。
TL;DR - 我建议不要将构造函数 设置为内部
。通过这样做,您还不如将类设置为内部
(您是通过算法的接口(interface)而不是它们的类来引用算法,对吧?)
另一种解决方案是将类的实现设为private
并将它们嵌套在工厂中。让他们都实现一个公共(public)接口(interface)(他们应该已经这样做了)并将该接口(interface)公开给应用程序的其余部分。这仍然不能避免难以测试的问题。
关于c# - 类实例创建限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25782108/