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

Java中实现外观模式时,可以使用package-private修饰符轻松隐藏外观的子系统.结果,只有一个小的界面可以从外观/程序包外部访问,子系统的其他类别是不可见的.

如您所知,C#中没有package-private修饰符,但是有一个类似的内部修饰符.根据文档,定义为internal的类只能在同一程序集中访问.

从我的理解中,我必须至少创建两个程序集(实际上是两个.exe / .dll文件),以便物理上隐藏外观的子系统.从物理上讲,我的意思是,类a)不能从外部实例化,而b)不能由立面外部的智能感知显示.

>我是否真的必须将我的小项目分成一个.exe和一个.dll(用于外观),以便内部关键字起作用?我的门面的子系统仅包含2个类,而自己的.dll似乎过大了.
>如果是,在Visual Studio中将我的外观外包给自己的程序集的最佳实践方法是什么?

不要误会我的意思,我确实不需要将程序拆分为几个程序集.我只想从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
    {
        //...
    }
}

出于隐私范围的目的,外部类实际上成为您的“包”.您可能不想对大型“包装”执行此操作;在这种情况下,将代码移至单独的程序集并使用内部代码会更清洁.

请注意,如果主要反对多个程序集是部署,则实际上可以将merge multiple assemblies用于创建更简单的可执行文件或库部署.这样,您可以保留多个项目/程序集的绝缘优势,而不必担心可能会独立分发或版本化的多个文件.

上一篇:设计模式-10外观模式(Facade Pattern)


下一篇:外观模式(c++实现)