Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Using commands

geoffreysmith edited this page · 11 revisions
Clone this wiki locally

Recipe #003 - Using Commands


Inspiration: CQRS a la Greg Young

Lets first consider what would normally happen after receiving a DTO; the user would make changes to the data and save this >back on the DTO. This DTO then gets shipped back to the back-end, converted into an entity and the ORM will make sure that >the changes are persisted into the database.

This would result in loosing some very valuable information; the Why did this change happen? You completely loose the >intent the user had when he changed the data, and this is one of the things Greg’s implementation of CQRS is solving.

Commands, CommandHandlers and their Result live in the Tasks Layer. A Command is sent to a Handler, and returns a result.

Example Implementation


public class ChangeCustomerAddressCommand : CommandBase
    public ChangeCustomerAddressCommand(
                                        int id, 
                                        string addressLine1, 
                                        string addressLine2, 
                                        string city,
                                        string stateProvince,
                                        string postalCode,
                                        string countryRegion)
        this.Id = id;
        this.AddressLine1 = addressLine1;
        this.AddressLine2 = addressLine2;
        this.City = city;
        this.StateProvince = stateProvince;
        this.PostalCode = postalCode;
        this.ModifiedDate = DateTime.Now;
        this.CountryRegion = countryRegion;

    public int Id { get; set; }

    public string AddressLine1 { get; set; }

    public string AddressLine2 { get; set; }

    public string City { get; set; }

    public string StateProvince { get; set; }

    public string PostalCode { get; set; }

    public DateTime ModifiedDate { get; set; }

    public string CountryRegion { get; set; }



public class ChangeCustomerAddressHandler : ICommandHandler<ChangeCustomerAddressCommand>
    private readonly INHibernateRepository<Address> addressRepository;

    public ChangeCustomerAddressHandler(INHibernateRepository<Address> addressRepository)
        this.addressRepository = addressRepository;

    public ICommandResult Handle(ChangeCustomerAddressCommand command)
        var address = this.addressRepository.Get(command.Id);
        var newAddress = new Address
                                 AddressLine1 = command.AddressLine1,
                                 AddressLine2 = command.AddressLine2,
                                 City = command.City,
                                 StateProvince = command.StateProvince,
                                 PostalCode = command.PostalCode,
                                 ModifiedDate = command.ModifiedDate,
                                 CountryRegion = command.CountryRegion

        address = newAddress;

        return new ChangeCustomerAddressResult(true);


public class ChangeCustomerAddressResult : CommandResult
    public ChangeCustomerAddressResult(bool success) : base(success)

    public string Message { get; set; }



Something went wrong with that request. Please try again.