在azure中托管共享dll

时间:2012-09-01 18:26:17

标签: c# asp.net winforms dll azure

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

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

由于我的所有项目都在Azure上的同一个Affinity Group中,是否有替代方法可以集中这个DLL,并且它可以让所有项目共享?我在网上找不到任何东西,所以我希望得到一些好的选择,并想到社区的初学者。如果我留下任何细节,请告诉我。

3 个答案:

答案 0 :(得分:4)

David在解释如何管理库的部署方面做得非常出色。但除此之外,您需要对架构进行更改以支持这种相当动态的场景。

首先,您的应用程序应该使用接口,而不是使用实现。我们假设您的图书馆允许您计算税金,并且该税收计算器的实施每隔几周就会发生变化。您不希望每次都更改您的应用程序,显然,WCF服务不适合您。

现在你可以按如下方式实现它:

  • 类库:包含ITaxCalculator接口的 TaxCalculator.Contracts
  • 类库: TaxCalculator.ImplementationABC ,包含实现ITaxCalculator接口的ABCTaxCalculator类。
  • 类库: TaxCalculator.ImplementationDEF ,包含实现ITaxCalculator接口的DEFTaxCalculator类(几周后)。
  • 等...

您的ASP.NET MVC网站仅适用于ITaxCalculator界面。使用MEF,您可以扫描文件夹(LocalResource)以查找包含实现ITaxCalculator接口的类的任何程序集。因此,您将Web应用程序与税务计算器库分离。

就像大卫已经解释的那样,你可以在blob存储中存储最新版本的库,并在用MEF加载程序集之前在本地下载(在LocalResource中)。这样原始应用程序保持不变,您仍然可以对库进行必要的更改。

为了通知每个实例已发布新版本,您有几个选项。您可以运行一个计时器来检查容器中的更改,您可以使用服务总线主题(每个实例都会订阅该主题),...但是像大卫已经解释的那样,您需要管理滚动升级自己申请。

另一种方法是重新部署您的应用程序,而不是让计时器不断轮询Blob容器中的更改,您可以只使用一个启动任务来下载最新版本的库。

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:0)

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

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