如何在C#中实现facade模式并物理隐藏子系统

如何在C#中实现facade模式并物理隐藏子系统,c#,.net,visual-studio-2010,design-patterns,facade,C#,.net,Visual Studio 2010,Design Patterns,Facade,在Java中实现facade模式时,我可以通过使用包私有修饰符轻松隐藏facade的子系统。因此,只有一个小型接口可从门面/包外部访问,子系统的其他类不可见 正如您已经知道的,在C#中没有包私有修饰符,而是一个类似的名为internal的修饰符。根据文档,定义为内部的类只能在同一程序集中访问 根据我的理解,我必须创建至少两个程序集(实际上意味着两个.exe/.dll文件),以便在物理上隐藏facade的子系统。从物理上讲,我的意思是a)类不能从外部实例化,b)类不能由外观外部的intellise

在Java中实现facade模式时,我可以通过使用包私有修饰符轻松隐藏facade的子系统。因此,只有一个小型接口可从门面/包外部访问,子系统的其他类不可见

正如您已经知道的,在C#中没有包私有修饰符,而是一个类似的名为internal的修饰符。根据文档,定义为内部的类只能在同一程序集中访问

根据我的理解,我必须创建至少两个程序集(实际上意味着两个.exe/.dll文件),以便在物理上隐藏facade的子系统。从物理上讲,我的意思是a)类不能从外部实例化,b)类不能由外观外部的intellisense显示

  • 我真的必须将我的小项目拆分为一个.exe和一个.dll(对于facade)以便internal关键字起作用吗?我的facade子系统只包含2个类,一个自己的.dll似乎有些过分
  • 如果是,VisualStudio中将我的外观外包给它自己的组件的最佳实践方式是什么

  • 别误会,我真的不需要把我的程序分成几个程序集。我只是想在IntelliSense面前隐藏一些门面后面的类,并防止外部实例化。但是如果我没有错的话,没有更简单的方法了。

    使用一个单独的项目是通常首选的方法。事实上,您通常在第三个程序集中有接口或外观,实现程序集和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
        {
            //...
        }
    }
    
    出于隐私范围的目的,外部类实际上成为了您的“包”。您可能不希望对大型“包”执行此操作;在这些情况下,将代码移动到一个单独的程序集并使用内部代码会更干净


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

    据我所知,facade模式背后的一个理念,是为需要简单功能的客户端提供一个简单的接口,但仍然可以为更高级的客户端提供子系统的全部高级功能。那么,为什么要隐藏子系统呢?好吧,我的问题不是很好,忘掉门面模式吧。我只想隐藏一些类。或者说,我想把我的外观变成一个封装的组件。一个程序集可以通过
    InternalsVisibleToAttribute
    通过“友元程序集”将对其内部的访问权授予其他程序集。但是,还不清楚您真正想要实现什么,所以我不知道这是否会有任何帮助。您可以使用嵌套类。正如你所说,一个复杂的系统通常是正面的。我不确定两个类是否算复杂。但我肯定看到了包/命名空间私有成员的好处。这太棒了。我一直很好奇,合并程序集会影响内部关键字吗?也就是说,以前不可用的对象和方法(由于单独的程序集)会突然变为可用吗?@Mystere Man,CLR仍然加载了多个程序集。这只是一个引导加载程序技巧,允许从单个文件而不是多个文件中提取多个程序集。