引用的 .dll 中的对象名称更改炸毁应用程序

Object name inside of referenced .dll changed blowing up application

如果有人能向我解释 .NET 引用在编译 .dll 时如何工作,我将不胜感激。

我有两个 .dll-s,我的主要 application.dll 引用了我的 services.dll。 services.dll 的目的是为与第三方服务的通信提供一个解耦层,以便对集成的更改不会直接影响应用程序。

为了实现这种解耦,我继承了服务主对象,在主应用程序中公开和使用新对象:

public class CustomClient : ServiceClient_v1
{
  public CustomClient(binding, address) : base (binding, address) {}
}

但是,我发现当 ServiceClient_v1 更新为 ServiceClient_v2 并且我尝试更新 services.dll 然后我的 application.dll 爆炸说:

Could not load type "ServiceClient_v1" from assembly services.dll

所以它仍然挂在对我试图隐藏的另一个对象的直接引用上。我认为这是设计使然,只是与我不理解的编译有关。

有没有办法实现我想要的?为什么我的方法不起作用?

由于您是从 application.dll 中的 ServiceClient_v1 派生 CustomClient,因此它仅适用于包含 services.dll 定义的旧版本 services.dll =11=]。正如 Lasse Vågsæther Karlsen 指出的那样,ServiceClient_v1 class 成为 CustomClient 的 public 声明的一部分。

我相信在您的申请中应用 Dependency Injection and the Liskov substitution principle 会让您受益。

为了实现真正可互换的 services.dll 的目标,您需要重构您的架构,从 application.dll 中移除 services.dll 的依赖性,反之亦然。

为您的 ServiceClient 类型定义一个 InterfaceCustomClientServiceClient_v1 都必须实现这个接口。

当您稍后更新代码以使用 ServiceClient_v2 时,它还应该实现该接口,该接口将保持不变。现在一切都继续工作,无需重新编译 application.dll 项目。

或者,在从 v1 移动到 v2 时,不要重命名 services.dll 中的 ServiceClient 类型 这就是 git 或 SVN 等版本控制系统的用途。