我们有大量的应用程序使用名为 Auth.dll 的库。这个库总是安装在我们服务器的GAC中。
现在我们正在重构它,所以我们将Auth.dll拆分为两个新的
当我们部署重构的库(不重新编译客户端应用程序)时,我们得到它们无法找到类,因为它们已经从 Auth.dll 到 OAuth.dll。我们错误地认为尊重命名空间和类设计会起作用
我们需要做些什么才能完成重构 Auth.dll 和库代码文件结构,而无需重新编译客户端应用程序?
有没有更好的方法来完成此操作而不是执行以下操作?
我们能够获得这三个库。
我们在Auth.dll中使用继承来反映现在驻留在其他库中的重构功能。
注意:我移动的大多数类都是这样构造的:
public class UserEntity
{
static public UserEntity FindByNif( string nif )
{
UserEntity ent = ....//operations;
return ent;
}
}
他们返回类本身的实例
答案 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();
}
}
}