David 在解释如何管理库的部署方面做得很好。但除此之外,您还需要对架构进行更改以支持这种相当动态的场景。
首先,您的应用程序不应使用实现,而应使用接口。假设您的库允许您计算税款,并且此税款计算器的实现每隔几周就会更改一次。您不想每次都为此更改您的应用程序,而且很明显,WCF 服务不适合您。
现在您可以按如下方式实现它:
- 类库:TaxCalculator.Contracts包含 ItaxCalculator 接口。
- 类库:TaxCalculator.ImplementationABC包含实现 ItaxCalculator 接口的 ABCTaxCalculator 类。
- 类库:TaxCalculator.ImplementationDEF包含实现 ItaxCalculator 接口的 DEFTaxCalculator 类(几周后)。
- ETC...
您的 ASP.NET MVC 网站只能使用 ItaxCalculator 接口。使用MEF,您可以扫描文件夹 (LocalResource) 以查找包含实现 ItaxCalculator 接口的类的任何程序集。因此,您将 Web 应用程序与税收计算器库分离。
就像 David 已经解释的那样,您可以将最新版本的库存储在 blob 存储中,并在使用 MEF 加载程序集之前将其下载到本地(在 LocalResource 中)。这样,原始应用程序保持不变,您仍然可以对库进行必要的更改。
为了通知每个实例新版本已经发布,您有几个选项。您可以运行一个计时器来检查容器中的更改,您可以使用服务总线主题(每个实例都会订阅该主题),......但是就像大卫已经解释的那样,您需要管理滚动升级自己申请。
另一种方法是重新部署您的应用程序,而不是让计时器不断轮询 blob 容器中的更改,您可以简单地执行一个下载最新版本库的启动任务。