1

我有一个 C# 类库,它正在编译到多个应用程序中,所有这些应用程序都托管为 Azure 上的 ASP.NET 4.0 WebForm 和/或 MVC 云服务。我想集中这个库,以便对包的任何更新都不需要在每个更新周期编译和部署每个项目。

显然,我可以选择创建 WCF 服务,但这需要我重构类库以及使用它的每个项目成为服务的消费者,并且由于系统的复杂性,这可能需要几个月的时间并且不是短期的选择。

由于我的所有项目都在 Azure 上的同一个 Affinity Group 中,是否有替代集中此 DLL 以及所有项目共享的方法的替代方法?我在网上找不到任何东西,所以我希望从社区中获得一些好的选择和想法。如果我遗漏了任何细节,请告诉我。

4

3 回答 3

4

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 容器中的更改,您可以简单地执行一个下载最新版本库的启动任务。

于 2012-09-01T20:47:07.963 回答
3

将共享 DLL 存储在同一数据中心的 blob 存储中怎么样?在角色启动时,每个实例都会将最新的 DLL 下载到其本地存储(在应用程序的根目录或其他需要的文件夹中)。

在同一个数据中心内,blob 存储和您的角色实例之间的带宽是免费的,并且 100Mbps x # 的核心,因此非常快。而且,要更新 DLL,您只需要将其上传到一个地方(blob 容器)。

在更新其中一个 DLL 时,您需要向您的角色实例发出信号以进行回收(最安全的方法),或者使用最新的 DLL 更新自己。您不能像拥有文件监视程序那样拥有“blob 监视程序”(因此建议发送信号)。或者,您可以让某种类型的后台线程每隔几分钟检查一次“dll”容器,并在发现一个已更改的容器时,在本地触发更新。

提醒一句:如果您更新 DLL,并且每个角色实例都在轮询更改(或收到信号以回收),请注意不要同时回收所有实例。否则,您将获得暂时不可用的服务。

于 2012-09-01T20:08:29.573 回答
0

我也有同样的问题。我的方案是根据某些条件保留几个在运行时加载的插件,这些插件应该能够在不干扰主应用程序的情况下进行更新。

我所做的是将 dll 存储在 SQL 表中并在需要时检索它们,并在运行时使用反射加载它们。这是在内存中完成的,我不必将 dll 存储在应用程序根目录或其他地方。我认为在 Azure 中引用本地路径不是一个好习惯。

于 2012-09-02T03:42:47.987 回答