c# - 类实例创建限制

标签 c# factory class-visibility

我有很多实现相同接口(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/

相关文章:

python - 玩转对象创建

java - 为什么不能通过反射访问公共(public)构造函数

java - 从单独的类文件访问公共(public)静态类的状态

c# - Json.net 上的反序列化更改属性类型和名称

c# - WPF C#字符串转十进制,十进制转字符串问题

c# - 是否值得为单个类抽象出对象创建?

c# - 这是接口(interface)的错误使用吗?

rust - Hack Rust 可见性和隐私

c# - 命名空间 'Controls' 中不存在类型或命名空间名称 'System.Windows'(是否缺少程序集引用?)

c# - 将 google 身份验证添加到 **现有** .net core 2 web api 项目