解耦代码段变更告警方法及VB.NET项目依赖解耦问题咨询
问题背景
我编写了A、B、C三个代码组件:A、B为类库,C为可执行文件。B*引用(references)A同时导入(imports)*A;C同时引用A和B,但仅导入B、不导入A,我特意同时标注“imports”和“references”,后续问题会涉及该点。
组件代码示例
组件A(编译为MyMathsLibrary.dll)
定义了MathOperations类,包含ADD方法:
Public Class MathOperations 'Part A Function ADD(ByVal a As Integer, ByVal b As Integer) As Integer Return (a + b) End Function End Class
组件B(编译为FactoryMathsLibrary.dll)
定义Factory类,包含createMathsObject方法,返回MathOperations类型对象,B引用并导入A:
Imports MyMathsLibrary 'Part B Public Class Factory Shared Function createMathsObject() As MathOperations Return New MathOperations() End Function End Class
组件C(可执行文件)
同时引用A和B,但仅导入B:
Imports FactoryMathsLibrary 'Part C Module Module1 Sub Main() Dim a, b As Integer Dim m As Object = Factory.createMathsObject() Console.Write("Enter 1st value: ") a = Console.ReadLine() Console.Write("Enter 2nd value: ") b = Console.ReadLine() Console.WriteLine("a + b = {0}", m.ADD(a, b)) Console.ReadLine() End Sub End Module
问题解答
问题1:如何实现A类方法名变更时,C代码触发编译时报错?
运行时报错的核心原因是C中把createMathsObject的返回值声明为Object类型,VB.NET对Object类型的成员调用默认使用后期绑定,编译阶段不会校验成员是否存在,只有运行时才会动态解析。
实现编译时报错的方案如下:
- 第一步:在C项目的属性页开启
Option Strict On,或者在C代码文件的第一行添加Option Strict On(仅对当前文件生效),开启后所有后期绑定代码会直接触发编译错误。 - 第二步:将C中
Dim m As Object修改为强类型声明Dim m As MathOperations(需要在C中导入A的命名空间,或者写完整类名MyMathsLibrary.MathOperations)。
修改完成后,如果A中的ADD方法重命名,C中调用m.ADD的位置会直接在编译阶段抛出错误,无需等到运行时。
问题2:C仅引用B不引用A的解耦结构,是C#独有特性吗?
这不是C#和VB.NET的语言差异,是你对教程实现逻辑的理解有误。
不管是C#还是VB.NET,只要B的公开API返回了A中定义的具体类类型,那么调用这个API的C项目必须直接引用A,这是.NET运行时的通用规则,两种语言没有区别。
你看到的C#教程能实现C仅引用B的结构,本质是用了接口抽象做了架构调整,调整方案对VB.NET同样生效:
- 新增一个公共接口类库,定义
IMathOperations接口,包含ADD方法签名 - A中的
MathOperations类实现这个公共接口 - B的
createMathsObject方法返回值类型从具体的MathOperations改为IMathOperations
调整完成后,C只需要引用B和公共接口类库,不需要直接引用A,即可实现完全解耦的结构。
内容的提问来源于stack exchange,提问作者Sougata
相关产品推荐
相关产品推荐

