3

在 Java 中实现外观模式时,我可以通过使用 package-private 修饰符轻松隐藏外观的子系统。结果,只有一个小接口可以从外观/包外部访问,子系统的其他类不可见。

如您所知,C# 中没有 package-private 修饰符,但有一个类似的修饰符,称为 internal。根据文档,定义为 internal 的类只能在同一个 assembly 中访问

据我了解,我必须创建至少两个程序集(实际上是两个 .exe/.dll 文件)才能在物理上隐藏外观的子系统。在物理上,我的意思是类 a) 不能从外部实例化,并且 b) 不会由外观外的智能感知显示。

  1. 我真的必须将我的小项目拆分为一个 .exe 和一个 .dll(用于外观),以便 internal 关键字起作用吗?我的门面子系统只包含 2 个类,一个自己的 .dll 似乎是矫枉过正。
  2. 如果是,Visual Studio 中将我的外观外包给它自己的程序集的最佳实践方式是什么?

不要误会我的意思,我没有真正需要将我的程序分成几个程序集。我只想从 IntelliSense 隐藏我的外观后面的一些类,并防止从外部实例化。但如果我没记错的话,没有比这更简单的方法了。

4

1 回答 1

3

使用单独的项目是一般首选方法。事实上,您经常在实现和 UI 程序集都引用的第三个程序集中具有接口或外观。

也就是说,您可以使用嵌套的私有子类在单个程序集中完成此操作。

public interface IMyService {}

public static class MyServiceBuilder
{
    public static IMyService GetMyService()
    {
        //Most likely your real implementation has the service stored somewhere
        return new MyService();
    }

    private sealed class MyService : IMyService
    {
        //...
    }
}

外部类有效地成为隐私范围的“包”。您可能不想为大型“包裹”执行此操作;在这些情况下,将代码移动到单独的程序集并使用 internal 会更干净。

请注意,如果您对多个程序集的主要反对是部署,您实际上可以合并多个程序集以创建更简单的可执行文件或库部署。通过这种方式,您可以保留多个项目/程序集的绝缘优势,而不必为可能独立分发或版本控制的多个文件而烦恼。

于 2012-10-11T20:21:07.447 回答