Skip to main content
added the model
Source Link

Since you're doing it with CQRS in mind, I think your classes should look more like

Command class: encapsulates the command parameters

 class Administer { public Administer(string foo, int bar) { .... } public string Foo {get; private set;} public int Bar {get; private set;} } 

Command Handler: pass the command to the specialized types, don't do any validation here

class HandleAdminister { private readonly Administration _administration; public HandleAdminister(Administration administration) { _administration = administration; } public void Handle(Administer command) { administration.Administer(command.Foo, command.Bar); } } 

Command Validator: validation is a separate concern, we create a type to handle validation only

class ValidateAdminister { private readonly IReadEntities _readEntities; public ValidateAdminister(IReadEntities readEntities) { _readEntities = readEntities; } public bool Validate(Administer command) { ... heavy or light validation here var unadministered = _readEntities .Query<Prescription>() .Any(c=>c.Unadministered && c.Foo == command.Foo); return !unadministered; } } 

Client code to execute a command:

var administration = ... var command = new Administer("foo", 19); var handler = new HandleAdminister(administration); var validator = new ValidateAdminister(...); if (validator.Validate(command)) handler.Handle(command); 

A possible relation between a ViewModel and validators

class PatientViewModel { public bool CanAdminister {get; set;} public bool CanPrepare {get; set;} public Patient Patient {get; set;} } var model = new PatientViewModel(); model.Patient = ...; model.CanAdminister = administerCommandValidator.Validate(administerCommand); model.CanPrepare = prepareCommnadValidator.Validate(prepareCommand); 

The point is you can use the validator to validate the command before executing it and also to build a model for the UI.

Since you're doing it with CQRS in mind, I think your classes should look more like

Command class: encapsulates the command parameters

 class Administer { public Administer(string foo, int bar) { .... } public string Foo {get; private set;} public int Bar {get; private set;} } 

Command Handler: pass the command to the specialized types, don't do any validation here

class HandleAdminister { private readonly Administration _administration; public HandleAdminister(Administration administration) { _administration = administration; } public void Handle(Administer command) { administration.Administer(command.Foo, command.Bar); } } 

Command Validator: validation is a separate concern, we create a type to handle validation only

class ValidateAdminister { private readonly IReadEntities _readEntities; public ValidateAdminister(IReadEntities readEntities) { _readEntities = readEntities; } public bool Validate(Administer command) { ... heavy or light validation here var unadministered = _readEntities .Query<Prescription>() .Any(c=>c.Unadministered && c.Foo == command.Foo); return !unadministered; } } 

Client code:

var administration = ... var command = new Administer("foo", 19); var handler = new HandleAdminister(administration); var validator = new ValidateAdminister(...); if (validator.Validate(command)) handler.Handle(command); 

Since you're doing it with CQRS in mind, I think your classes should look more like

Command class: encapsulates the command parameters

 class Administer { public Administer(string foo, int bar) { .... } public string Foo {get; private set;} public int Bar {get; private set;} } 

Command Handler: pass the command to the specialized types, don't do any validation here

class HandleAdminister { private readonly Administration _administration; public HandleAdminister(Administration administration) { _administration = administration; } public void Handle(Administer command) { administration.Administer(command.Foo, command.Bar); } } 

Command Validator: validation is a separate concern, we create a type to handle validation only

class ValidateAdminister { private readonly IReadEntities _readEntities; public ValidateAdminister(IReadEntities readEntities) { _readEntities = readEntities; } public bool Validate(Administer command) { ... heavy or light validation here var unadministered = _readEntities .Query<Prescription>() .Any(c=>c.Unadministered && c.Foo == command.Foo); return !unadministered; } } 

Client code to execute a command:

var administration = ... var command = new Administer("foo", 19); var handler = new HandleAdminister(administration); var validator = new ValidateAdminister(...); if (validator.Validate(command)) handler.Handle(command); 

A possible relation between a ViewModel and validators

class PatientViewModel { public bool CanAdminister {get; set;} public bool CanPrepare {get; set;} public Patient Patient {get; set;} } var model = new PatientViewModel(); model.Patient = ...; model.CanAdminister = administerCommandValidator.Validate(administerCommand); model.CanPrepare = prepareCommnadValidator.Validate(prepareCommand); 

The point is you can use the validator to validate the command before executing it and also to build a model for the UI.

improved formatting, a more general purpose interface for retrieving entities
Source Link

Since you're doing it with CQRS in mind, I think your classes should look more like

Command class: encapsulates the command parameters

 class Administer { public Administer(string foo, int bar) { .... } public string Foo {get; private set;} public int Bar {get; private set;} } 

Command Handler: pass the command to the specialized types, don't do any validation here

class HandleAdminister { private readonly Administration _administration; public HandleAdminister(Administration administration) { _administration = administration; } public void Handle(Administer command) { administration.Administer(command.Foo, command.Bar); } } 

Command Validator: validation is a separate concern, we create a type to handle validation only

class ValidateAdminister { private readonly IReadFromADatabaseIReadEntities _readFromADatabase;_readEntities; public ValidateAdminister(IReadFromADatabaseIReadEntities _readFromADatabasereadEntities) { _readFromADatabase=_readEntities readFromADatabase;= readEntities; } public bool Validate(Administer command) { ... heavy or light validation here var unadministered = _readFromADatabase_readEntities .Entities<Prescription>Query<Prescription>() .Any(c=>c.Unadministered && c.Foo == command.Foo); return !unadministered; } } 

Client code:

var administration = ... var command = new Administer("foo", 19); var handler = new HandleAdminister(administration); var validator = new ValidateAdminister(...);   if (validator.Validate(command)) handler.Handle(command); 

Since you're doing it with CQRS in mind, I think your classes should look more like

Command class: encapsulates the command parameters

 class Administer { public Administer(string foo, int bar) { .... } public string Foo {get; private set;} public int Bar {get; private set;} } 

Command Handler: pass the command to the specialized types, don't do any validation here

class HandleAdminister { private readonly Administration _administration; public HandleAdminister(Administration administration) { _administration = administration; } public void Handle(Administer command) { administration.Administer(command.Foo, command.Bar); } } 

Command Validator: validation is a separate concern, we create a type to handle validation only

class ValidateAdminister { private readonly IReadFromADatabase _readFromADatabase; public ValidateAdminister(IReadFromADatabase _readFromADatabase) { _readFromADatabase= readFromADatabase; } public bool Validate(Administer command) { ... heavy or light validation here var unadministered = _readFromADatabase .Entities<Prescription>() .Any(c=>c.Unadministered && c.Foo == command.Foo); return !unadministered; } } 

Client code:

var administration = ... var command = new Administer("foo", 19); var handler = new HandleAdminister(administration); var validator = new ValidateAdminister(...); if (validator.Validate(command)) handler.Handle(command); 

Since you're doing it with CQRS in mind, I think your classes should look more like

Command class: encapsulates the command parameters

 class Administer { public Administer(string foo, int bar) { .... } public string Foo {get; private set;} public int Bar {get; private set;} } 

Command Handler: pass the command to the specialized types, don't do any validation here

class HandleAdminister { private readonly Administration _administration; public HandleAdminister(Administration administration) { _administration = administration; } public void Handle(Administer command) { administration.Administer(command.Foo, command.Bar); } } 

Command Validator: validation is a separate concern, we create a type to handle validation only

class ValidateAdminister { private readonly IReadEntities _readEntities; public ValidateAdminister(IReadEntities readEntities) { _readEntities = readEntities; } public bool Validate(Administer command) { ... heavy or light validation here var unadministered = _readEntities .Query<Prescription>() .Any(c=>c.Unadministered && c.Foo == command.Foo); return !unadministered; } } 

Client code:

var administration = ... var command = new Administer("foo", 19); var handler = new HandleAdminister(administration); var validator = new ValidateAdminister(...);   if (validator.Validate(command)) handler.Handle(command); 
Source Link

Since you're doing it with CQRS in mind, I think your classes should look more like

Command class: encapsulates the command parameters

 class Administer { public Administer(string foo, int bar) { .... } public string Foo {get; private set;} public int Bar {get; private set;} } 

Command Handler: pass the command to the specialized types, don't do any validation here

class HandleAdminister { private readonly Administration _administration; public HandleAdminister(Administration administration) { _administration = administration; } public void Handle(Administer command) { administration.Administer(command.Foo, command.Bar); } } 

Command Validator: validation is a separate concern, we create a type to handle validation only

class ValidateAdminister { private readonly IReadFromADatabase _readFromADatabase; public ValidateAdminister(IReadFromADatabase _readFromADatabase) { _readFromADatabase= readFromADatabase; } public bool Validate(Administer command) { ... heavy or light validation here var unadministered = _readFromADatabase .Entities<Prescription>() .Any(c=>c.Unadministered && c.Foo == command.Foo); return !unadministered; } } 

Client code:

var administration = ... var command = new Administer("foo", 19); var handler = new HandleAdminister(administration); var validator = new ValidateAdminister(...); if (validator.Validate(command)) handler.Handle(command);