将类从一个库移到另一个库=>如果不重新编译,客户端应用程序无法识别更改

时间:2017-11-07 11:23:52

标签: .net refactoring legacy-code

我们有大量的应用程序使用名为 Auth.dll 的库。这个库总是安装在我们服务器的GAC中。

现在我们正在重构它,所以我们将Auth.dll拆分为两个新的

  • OAuth.dll
  • LegacyAuth.dll

当我们部署重构的库(不重新编译客户端应用程序)时,我们得到它们无法找到类,因为它们已经从 Auth.dll OAuth.dll。我们错误地认为尊重命名空间和类设计会起作用

我们需要做些什么才能完成重构 Auth.dll 和库代码文件结构,而无需重新编译客户端应用程序?

有没有更好的方法来完成此操作而不是执行以下操作?

我们能够获得这三个库。

  1. OAuth.dll
  2. LegacyAuth.dll
  3. Auth.dll
  4. 我们在Auth.dll中使用继承来反映现在驻留在其他库中的重构功能。

    注意:我移动的大多数类都是这样构造的:

    public class UserEntity     
    {   
       static public UserEntity FindByNif( string nif )
       {
            UserEntity ent = ....//operations;
            return ent;
       }
    }
    

    他们返回类本身的实例

2 个答案:

答案 0 :(得分:0)

你做不到。如果不重新编译客户端应用程序,就无法做到这一点。

您可能在将来构建您的客户端应用程序是如此动态,以至于这是可能的,但是您不仅需要重新编译它们以执行此操作,而且这样做的努力远远大于仅在您更改时重新编译Auth库。

我建议您在重构之前编写单元测试,这样您就会看到在代码中引入重大更改的时候。

假设您从头开始全部执行,您可以在原始库中实现factory pattern,因此您只需调整原始库以返回所需界面的不同实例,客户端应用程序只知道接口,无需重新编译。但是,这是你应该所做的事情。我担心你目前的情况没有实际帮助。

答案 1 :(得分:0)

这是一个我自己没有尝试的想法,但理论上它可以起作用:

  • 提供 Auth.dll 的新版本,仍然包含所有必需的类,但是将它们实现为新类 OAuth.dll LegacyAuth.dll 。适配器必须是"接口兼容"到以前的类版本(带有签名的公共方法必须保持不变)。

  • 使用程序集绑定重定向(like described in this older SO post)使依赖应用程序加载新的DLL。

第二步需要提供为每个应用程序部署新的app.config,但不进行重新编译。但是,您应该问自己为什么要考虑重新编译和重新部署这样一个大问题 - 这些步骤可以(并且应该)以大多数自动化方式实现,否则您将无法快速部署任何严重错误修正需要完全重新部署。

编辑:这样的适配器可能如下所示:

namespace Auth
{
    public class UserEntity     
    {   
       OAuth.UserEntity oaUserEntity;
       public UserEntity(OAuth.UserEntity oaUserEntity)
       {
           this.oaUserEntity=oaUserEntity;
       }
       static public UserEntity FindByNif( string nif )
       {
            // delegate the logic to the new class implementation
            OAuth.UserEntity ent = OAuth.UserEntity.FindByNif(nif);
            return new UserEntity(ent);
       }
       // another example:
       public int SomeMethod()
       {
            return this.oaUserEntity.SomeMethod();
       }
    }
 }