如何在C#中实现facade模式并物理隐藏子系统
在Java中实现facade模式时,我可以通过使用包私有修饰符轻松隐藏facade的子系统。因此,只有一个小型接口可从门面/包外部访问,子系统的其他类不可见 正如您已经知道的,在C#中没有包私有修饰符,而是一个类似的名为internal的修饰符。根据文档,定义为内部的类只能在同一程序集中访问 根据我的理解,我必须创建至少两个程序集(实际上意味着两个.exe/.dll文件),以便在物理上隐藏facade的子系统。从物理上讲,我的意思是a)类不能从外部实例化,b)类不能由外观外部的intellisense显示如何在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
别误会,我真的不需要把我的程序分成几个程序集。我只是想在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仍然加载了多个程序集。这只是一个引导加载程序技巧,允许从单个文件而不是多个文件中提取多个程序集。