پیاده سازی پروژهای مبتنی بر CQRS و ES
نویسنده: خلیلی
تاریخ: ۱۳۹۶/۰۲/۱۵ ۱۹:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
using System;
using SimpleCqrs.Domain;
namespace CqrsPattern.Cqrs.Command
{
public class Account : AggregateRoot
{
public Account(Guid id)
{
Apply(new AccountCreatedEvent { AggregateRootId = id });
}
public void SetName(string firstName, string lastName)
{
Apply(new AccountNameSetEvent { FirstName = firstName, LastName = lastName });
}
public void OnAccountCreated(AccountCreatedEvent evt)
{
Id = evt.AggregateRootId;
}
}
} using SimpleCqrs.Commanding;
namespace CqrsPattern.Cqrs.Command
{
public class CreateAccountCommand : ICommand
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
} using System;
using SimpleCqrs.Commanding;
using SimpleCqrs.Domain;
namespace CqrsPattern.Cqrs.Command
{
public class CreateAccountCommandHandler : CommandHandler<CreateAccountCommand>
{
private readonly IDomainRepository repository;
public CreateAccountCommandHandler(IDomainRepository repository)
{
this.repository = repository;
}
public override void Handle(CreateAccountCommand command)
{
var account = new Account(Guid.NewGuid());
account.SetName(command.FirstName, command.LastName);
repository.Save(account);
}
}
} using SimpleCqrs.Eventing;
namespace CqrsPattern.Cqrs.Command
{
public class AccountCreatedEvent : DomainEvent { }
} using SimpleCqrs.Eventing;
namespace CqrsPattern.Cqrs.Command
{
public class AccountNameSetEvent : DomainEvent
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
} using System.Linq;
using SimpleCqrs.Eventing;
using CqrsPattern.Cqrs.Db;
namespace CqrsPattern.Cqrs.Command
{
public class AccountEventHandler : IHandleDomainEvents<AccountCreatedEvent>,
IHandleDomainEvents<AccountNameSetEvent>
{
private readonly FakeAccountTable accountTable;
public AccountEventHandler(FakeAccountTable accountTable)
{
this.accountTable = accountTable;
}
public void Handle(AccountCreatedEvent domainEvent)
{
accountTable.Add(new FakeAccountTableRow { Id = domainEvent.AggregateRootId });
}
public void Handle(AccountNameSetEvent domainEvent)
{
var account = accountTable.Single(x => x.Id == domainEvent.AggregateRootId);
account.Name = domainEvent.FirstName + " " + domainEvent.LastName;
}
}
} using System.Collections.Generic;
namespace CqrsPattern.Cqrs.Db
{
public class FakeAccountTable : List<FakeAccountTableRow>
{ }
} using System;
namespace CqrsPattern.Cqrs.Db
{
public class FakeAccountTableRow
{
public Guid Id { get; set; }
public string Name { get; set; }
}
} using SimpleCqrs;
using SimpleCqrs.Unity;
namespace CqrsPattern
{
public class SampleRunTime : SimpleCqrsRuntime<UnityServiceLocator> { }
} using System;
namespace CqrsPattern.Cqrs.Query
{
public class AccountReadModel
{
public string Name { get; set; }
public Guid Id { get; set; }
}
} using CqrsPattern.Cqrs.Db;
using System.Collections.Generic;
using System.Linq;
namespace CqrsPattern.Cqrs.Query
{
public class AccountReportReadService
{
private FakeAccountTable fakeAccountDb;
public AccountReportReadService(FakeAccountTable fakeAccountDb)
{
this.fakeAccountDb = fakeAccountDb;
}
public IEnumerable<AccountReadModel> GetAccounts()
{
return from a in fakeAccountDb
select new AccountReadModel { Id = a.Id, Name = a.Name };
}
}
} using System;
using SimpleCqrs.Commanding;
using CqrsPattern.Cqrs.Query;
using CqrsPattern.Cqrs.Command;
namespace CqrsPattern
{
class Program
{
static void Main(string[] args)
{
var runtime = new SampleRunTime();
runtime.Start();
var fakeAccountTable = new FakeAccountTable();
runtime.ServiceLocator.Register(fakeAccountTable);
runtime.ServiceLocator.Register(new AccountReportReadService(fakeAccountTable));
var commandBus = runtime.ServiceLocator.Resolve<ICommandBus>();
var cmd = new CreateAccountCommand { FirstName = "Ali", LastName = "Kh" };
commandBus.Send(cmd);
var accountReportReadModel = runtime.ServiceLocator.Resolve<AccountReportReadService>();
Console.WriteLine("Accounts in database");
Console.WriteLine("####################");
foreach (var account in accountReportReadModel.GetAccounts())
{
Console.WriteLine(" Id: {0} Name: {1}", account.Id, account.Name);
}
runtime.Shutdown();
Console.ReadLine();
}
}
} public override void Handle(CreateAccountCommand command)
{
var account = new Account(Guid.NewGuid()); //line 1
account.SetName(command.FirstName, command.LastName); //line 2
repository.Save(account); //line 3
} public Account(Guid id)
{
Apply(new AccountCreatedEvent { AggregateRootId = id });
} public void SetName(string firstName, string lastName)
{
Apply(new AccountNameSetEvent { FirstName = firstName, LastName = lastName });
} public void Handle(AccountCreatedEvent domainEvent)
{
accountTable.Add(new FakeAccountTableRow { Id = domainEvent.AggregateRootId });
}
public void Handle(AccountNameSetEvent domainEvent)
{
var account = accountTable.Single(x => x.Id == domainEvent.AggregateRootId);
account.Name = domainEvent.FirstName + " " + domainEvent.LastName;
} var accountReportReadModel = runtime.ServiceLocator.Resolve<AccountReportReadService>(); var accounts = accountReportReadModel.GetAccounts();