如何隐藏程序集中的接口,避免API用户访问内部IRepository等接口
隐藏程序集内部接口的可行方案
- 使用
internal访问修饰符配合友元程序集特性
将所有不对外暴露的接口(如IRepository)、DataBaseAccess类的非公开方法所属类型的访问修饰符统一设置为internal,仅保留对外API的公开调用类和方法为public。由于你需要配套的桌面编辑器访问这些内部成员,可在API程序集的配置中添加[assembly: InternalsVisibleTo("编辑器程序集的完整名称")]特性,即可让编辑器获得内部成员访问权限,第三方用户引用你的API DLL时无法访问任何internal级别的类型、方法和接口。 - 拆分接口做权限隔离
若存在需要部分对外暴露的方法,可将现有IRepository拆分为两层:对外公开的只读接口IPublicRepository仅声明允许用户调用的读操作方法,内部使用的IInternalRepository继承该公开接口,额外补充所有Set*类操作和内部方法。内部业务逻辑仅依赖IInternalRepository实现,对外API层仅向用户返回IPublicRepository类型的实例,从根源上避免内部接口泄漏。 - 显式实现内部接口
若因架构限制必须将接口声明为public,可对内部接口的所有方法采用显式实现方式,例如:
该方式下用户拿到实现类实例时,默认看不到显式实现的接口方法,仅能在强制转换为对应接口类型时调用,配合前面的public class RepositoryImpl : IRepository { // 显式实现IRepository的Set方法 void IRepository.SetData(string key, object value) { // 实现逻辑 } }internal修饰符即可完全堵死外部访问路径。 - 增加API门面层做完全封装
不在对外逻辑中返回任何内部接口的实现实例,新增一层公开的API门面类,所有允许用户调用的方法都在门面类中显式声明,内部对IRepository等组件的调用逻辑完全封装在门面类内部,用户只能接触到门面类的公开方法,完全感知不到内部接口的存在。
内容的提问来源于stack exchange,提问作者NIKITA BOKOV
相关产品推荐
相关产品推荐

