私は、Azure ストレージを使用して、サード パーティ アプリケーションによって消費されるすべての外部バイナリを格納する、非常に大規模な中央メディア リポジトリであるプロジェクトに取り組んでいます。アプリは azure で動作しますが、多くの新機能の追加に向けて前進しており、"ローカル ボックスから開発およびテストする" 形式のテストではもはや十分ではありません。クラウドで動作する必要があるメディアをフィードする一連の外部ソースがあるため、統合テスト環境のセットアップが必要です。すでに環境をセットアップしましたが、質問は、Azure 開発ストレージを起動して Windows サービスとして実行する方法はありますか? 現在、ログインして azure developmentmet ストレージを手動で開始する必要がありますが、ログアウトするとシャットダウンします。これは理想的ではありませんし、うまくいきません。開発ボックスなので、そして、データのほとんどはがらくたです。スペースと帯域幅を無駄にしたくありません。これを azure アカウントに送信すると、費用がかかります。ありがとう!
2 に答える
十分な権限を持つユーザーアカウントで、ホストをスケジュールされたタスクとして実行できる必要があります。
Windows Azure 開発ファブリックは、そのままでは Windows サービスとして実行されません。
実際のサービスをポータブルに保ち、Console、WinService、または Azure Worker で実行できるようにする唯一の方法は、最初からそのような抽象化を設計することです。
適切な抽象化を行うと、クラウド アプリケーションは非常に柔軟になります。たとえば、次のような単体テストを作成することもできます。
[Test]
public void Test()
{
Host.Initialize();
Host.Start();
var client = Host.Resolve<IMessageClient>();
client.Send(new Hello {Word = "World"});
client.Send(new Hello {Word = Rand.String.NextText(6000, 6000)});
client.Send(new Bye {Word = "Earth"});
SystemUtil.Sleep(50.Seconds());
Host.Stop();
}
または、.NET 4.0 TPL が使用されている場合:
[Test]
public void Test()
{
using (var host = BuildHost())
{
host.Initialize();
var client = host.Resolve<IMessageClient>();
client.Send(new Hello { Word = "World" });
client.Send(new Hello { Word = Rand.String.NextText(6000, 6000) });
client.Send(new Bye { Word = "Earth" });
using (var cts = new CancellationTokenSource())
{
var task = host.Start(cts.Token);
SystemUtil.Sleep(10.Seconds());
cts.Cancel(true);
task.Wait(5.Seconds());
}
}
}
コンソール、WindowsService、Azure ホスト、または Linux の mono デーモンでも同様の配線が行われます。
また、ストレージを適切に抽象化したままにしておくと、テストに実際に Azure Storage (開発または運用) を使用する必要がなくなり、ローカル ファイル ストレージまたは適切なメモリ内表現を効率的に使用できます。
基本的に、最初から移植可能なクラウド アーキテクチャを設計すると、多くのことが簡素化され、開発と保守のコストが削減されます。
注: テスト スニペットは、Windows Azureガイダンスおよびフレームワークの Lokad.CQRSから取得したものです。