2017-12-01 3 views
0

我々は、.NETの世界に新しいしていると我々はプログラムでホットデプロイをすることができますし、上にそれをアンデプロイするように、私たちは、アプリケーションコード「パッケージ」への道を探しているNancyバンドルされたコードの.NETホットデプロイ/アンデプロイ。の仕方?どのコンテナ?

の上に小さなC#アプリケーションを構築しています最小限のNancyベースのコンテナ(または推奨するその他の適切なコンテナ)を使用してください。

.NETの世界ではどうすればよいですか?

JVMの世界では、サーブレットエンジン(通常はJettyまたはTomcat)の上にデプロイされるWebアプリケーションリソース(war)をパッケージ化する方法があります。他のソリューション(マイクロコンテナ、クラスローダーを直接使用するなど)があります。同等の.NETパラダイムを探しています。

EDIT 12月5日

アセンブリを構築し、そのようなAssembly.LoadFromStringなどのメソッドを使用して周りに解決策があるようです。

は、これはまだかなり手動ようで、私たちは、あなたがダウンタイムなしでウェブアプリを更新する場合msdeployを使用できるWindows/IIS上にある場合

+1

あなたは再起動せずにnancyアプリケーションを更新できるようにしたいですか? – Evk

+0

@Evkはい。再起動が必要な場合は避けたいのですが、これはプログラムでも実行する必要があります –

+1

nginx \ apache \ iisの後ろにホストされているのですか、raw nancyだけが使用されていますか?それは完全な.NETまたは.NETコアですか? – Evk

答えて

1

あなたは別々のAppDomainにあなたのコードをロードし、ホットリロードのシャドウコピーを使用することができます。

static void Main(string[] args) { 
    using (var host = new NancyHost(new Uri("http://localhost:34455"))) { 
     host.Start(); 
     Console.WriteLine("started"); 
     Console.ReadKey(); 
    } 
} 

public class SampleModule : Nancy.NancyModule { 
    public SampleModule() { 
     Get["/"] = _ => "Hello World!"; 
    } 
} 

そして、ホスティングプロセスを再開せずに更新できるようにしたいとします。このようにすることができます(警告 - 非生産準備コード、サンプルのみ)。

static void Main() { 
    while (true) { 
     var setup = new AppDomainSetup(); 
     setup.ApplicationBase = @"Path to directory with your nancy app"; 
     setup.ShadowCopyFiles = "true"; 
     var domain = AppDomain.CreateDomain("Nancy", new Evidence(), setup); 
     domain.ExecuteAssembly(@"Path to your nancy app exe"); 
     AppDomain.Unload(domain); 
    } 
} 

次に、2番目の(ホスト)アプリケーションを起動します。新しいアプリケーションドメインを作成し、そこにあなたのnancyアプリケーションを開始します。これで、ホストアプリケーションが動作している間に、nancyアプリケーションを更新することができます(そのシャドウコピーのために、ファイルはロックされていません)。更新を適用するには、ホストアプリケーションの任意のキーを押します。これにより、古いバージョンのアプリドメインが破棄され、プロセスを再起動することなく、新しいバージョンの新しいアプリドメインが作成されます。

このテクニックを使用すると、たとえば、アプリケーションとのディレクトリをFileSystemWatcherで監視し、アプリケーションドメインの変更をアプリケーションファイルに置き換えることができます。 nancyホストを起動する前に新しいappdomainを最初にロードしてから、古いappドメインを解凍して新しいアプリケーションドメインでnancyホストを起動することで、ダウンタイムを最小限に抑えることもできます。

0

ロード/アンロードを支援するためのC#ライブラリ/フレームワークを探しています。古いAppDomainがアンロードされている間は新しいAppDomainで新しいバージョンをスピンアップするため、メモリ内の状態は保持されません。

+0

私たちはIISを使用していません。我々は動的にコードをロードするC#ソリューションを探しています。 –

2

コードをアンロードする唯一の方法は、AppDomain全体をアンロードすることです。つまり、動的にロードするすべてのアセンブリに対して新しいAppDomainを作成したいと考えています。

この例では、あなたに新しいアプリケーションドメインを作成する方法についての出発点を与え、どのように別のAppDomainにロードされたコードを呼び出すために: https://stackoverflow.com/a/2648592/540832

1

残念ながら、これは.NETの世界では一般的な作業ではないため、広く普及しているプラ​​グインソリューションを見つける必要はありません。

後でSystem.Compositionとして知られるMicrosoft.Compositionとして知られるManaged Extensibility Frameworkがあります。 How to discover new MEF parts while the application is running?にお問い合わせください。探しているソリューションかもしれません。

using System.Composition with .NET Coreにもいくつかの記事があります。

AutoFacのようなIoCフレームワークを使用しても、自分でプラグインシステムを実装することは難しくありません。

アプリケーションにコールサービスを行うNancyモジュールがあり、サービスが動的に変更したい実際のロジックを実装しているとします。これは本質的にサービスをプラグインにします。アイデアは、httpコールごとにサービスの更新されたインスタンスを返すようにIoCを設定することです。

  1. リフレッシュを使用してリフレッシュされたアセンブリからサービスインスタンスを解決して作成するスコープ付きサービスプロバイダ\ファクトリを持つことができます。
  2. アセンブリの再読み込み時に、サービスコレクションコンテナをリフレッシュする(または新しいIoCコンテナを作成する)ことができます。

悲しいことに、どちらの場合でも、変更されたアセンブリファイルを手動で検出する必要がありますが、これはFileSystemWatcherクラスの簡単な作業です。

また、一部のIoCライブラリでは、実行時の依存関係を更新することは適切な方法ではありません。例えば、hereを見てください。

関連する問題