以下に、実際のコードを使用したサービスコンセプトの使用例を示します(以下を参照)。
それは、キューから消費し、WebサーバーとクライアントGUIからのメッセージをリッスンするサービスバスを構成することです。
メッセージを受信すると、ドメインが保証するロジックを実行し、イベントをディスクに保存し、それらのイベントをメッセージブローカーに公開します。
疎結合の大規模なアプリケーションのほとんどは、以下のような「ワーカー」アーキテクチャを実装しています。
Documentlyプロジェクトは、あなたのような人々が分散アーキテクチャを学ぶために作成したサンプルプロジェクトです。プロジェクトで私に直接質問するか、分岐して学習する機能を実装し、プルリクエストを送信します(そしてコードのコメントを取得します)。
https://github.com/haf/Documently/blob/master/src/Documently.Domain.Service/Program.cs:
using System.Threading;
using Castle.MicroKernel.Registration;
using Castle.Windsor;
using Documently.Infrastructure;
using Documently.Infrastructure.Installers;
using MassTransit;
using Topshelf;
using log4net;
using log4net.Config;
namespace Documently.Domain.Service
{
class Program
{
private static readonly ILog _Logger = LogManager.GetLogger(typeof (Program));
private IWindsorContainer _Container;
private IServiceBus _Bus;
public static void Main(string[] args)
{
Thread.CurrentThread.Name = "Domain Service Main Thread";
HostFactory.Run(x =>
{
x.Service<Program>(s =>
{
s.ConstructUsing(name => new Program());
s.WhenStarted(p => p.Start());
s.WhenStopped(p => p.Stop());
});
x.RunAsLocalSystem();
x.SetDescription("Handles the domain logic for the Documently Application.");
x.SetDisplayName("Documently Domain Service");
x.SetServiceName("Documently.Domain.Service");
});
}
private void Start()
{
XmlConfigurator.Configure();
_Logger.Info("setting up domain service, installing components");
_Container = new WindsorContainer()
.Install(
new RavenDbServerInstaller(),
new CommandHandlerInstaller(),
new EventStoreInstaller(),
new BusInstaller(Keys.DomainServiceEndpoint)
);
_Container.Register(Component.For<IWindsorContainer>().Instance(_Container));
_Bus = _Container.Resolve<IServiceBus>();
_Logger.Info("application configured, started running");
}
private void Stop()
{
_Logger.Info("shutting down Domain Service");
_Container.Release(_Bus);
_Container.Dispose();
}
}
}