7

Hay una tarea relacionada con que cambia el estado de una entidad. Y estoy bastante confundido pensando si debería ser un enfoque basado en eventos que implique algo como CQRS o puedo usar un State pattern y dejar toda la lógica dentro de las entidades.Uso de un modelo de dominio incorporado con un patrón de estado

He encontrado un artículo que muestra un modelo de dominio (o una parte de ella) que utiliza un patrón Estado: http://www.prowareness.com/blog/?p=1448

sistema de pedidos es bastante cerca de mi modelo de dominio. Entonces el ejemplo es genial. Pero todavía me pregunto si es una buena práctica teniendo en cuenta el patrón MVC y si es posible implementarlo con RavenDB/NHibernate.

EDIT: pregunta repensado

Vamos a seguir el ejemplo:

En primer lugar, aquí hay una entidad del dominio llamado Idea:

[Serializable] 
public class Idea : AbstractEntity<Guid> { 
    private static IStateFactory stateFactory; 
    private AbstractState state = new InitiatedState(); 

    [Required, StringLength(150)] 
    public String Title { get; set; } 
    [Required] 
    public String ProblemContext { get; set; } 
    public DateTime CreatedOn { get; set; } 
    public Guid InitiatorId { get; set; } 
    [Required] 
    public Decimal InvestmentAmount { get; set; } 

    public Boolean IsInitiated { 
     get { return this.state.IsInitiated; } 
    } 
    public Boolean IsRejected { 
     get { return this.state.IsRejected; } 
    } 
    public Boolean IsUnderInitialAssessment { 
     get { return this.state.IsUnderInitialAssessment; } 
    } 
    public Boolean IsConfirmedForImplementation { 
     get { return this.state.IsConfirmedForImplementation; } 
    } 
} 

Mientras AbstractState es:

public abstract class AbstractState { 
    public virtual Boolean IsInitiated { 
     get { return true; } 
    } 
    public virtual Boolean IsRejected { 
     get { return false; } 
    } 
    public virtual Boolean IsUnderInitialAssessment { 
     get { return false; } 
    } 
    public virtual Boolean IsConfirmedForImplementation { 
     get { return false; } 
    } 
} 

interfaz y la fábrica de estado se define así:

public interface IStateFactory { 
    AbstractState GetState(String state); 
} 

la idea final es poner el método:

public void AlterState(String stateString) { 
    this.state = stateFactory.GetState(stateString); 
} 
  1. es el diseño de acuerdo? ¿Cuáles son los contras y los pros?
  2. ¿Qué hay de la extensibilidad? Desde mi perspectiva, uno puede extender/implementar su propia fábrica estatal. Pero si hay un cambio en AbstractState, todo cambia en consecuencia.

¡Gracias!

Respuesta

2

CQRS y el patrón de estado son cosas completamente diferentes. El patrón de estado proporciona una forma de implementar un conjunto de estados o estados para un solo objeto, mientras que CQRS es un estilo arquitectónico. MVC no tiene nada que ver con el patrón de estado ni CQRS y es un estilo arquitectónico para la capa de presentación. Puede usar el patrón de estado junto con NHibernate; sin embargo, la asignación no será trivial y deberá implementar un IUserType personalizado para correlacionarlo con la clase de estado adecuada en función de los campos. RavenDB es muy diferente de NHibernate y el mapeo será un poco más fácil con él, pero es un sistema de base de datos completamente diferente.

1

CQRS sería si estuvieras usando sql para respaldar una herramienta de administración, y RavenDB para la interfaz ejecutara búsquedas. Tendría que enviar datos a RavenDB desde Sql en este escenario ficticio de CQRS.

Cuestiones relacionadas