7

Istnieje zadanie związane z zmieniającym się stanem jednostki. I jestem bardzo zdezorientowany myśląc, czy to powinno być podejście oparte na zdarzeniach, które obejmuje coś takiego jak CQRS lub mogę użyć State pattern i pozostawić całą logikę wewnątrz obiektów.Używanie modelu domeny z wzorcem State State

znalazłem artykuł, który pokazuje model domeny (lub kawałek IT), która używa wzoru Państwo: http://www.prowareness.com/blog/?p=1448

System Kolejność jest dość blisko mojego modelu domeny. Tak więc przykład jest świetny. Ale nadal zastanawiam się, czy jest to dobra praktyka, biorąc pod uwagę wzór MVC i czy można go zastosować z RavenDB/NHibernate?

EDIT: pytanie przemyśleć

Prześledźmy przykład:

Po pierwsze, oto podmiot domeny o nazwie 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; } 
    } 
} 

Zważywszy AbstractState jest:

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; } 
    } 
} 

i fabryka stan interfejsu jest zdefiniowany następująco:

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

ostateczna myśl jest wprowadzenie metody:

public void AlterState(String stateString) { 
    this.state = stateFactory.GetState(stateString); 
} 
  1. jest projekt ok? jakie są minusy i zalety?
  2. Co z rozszerzalnością? Z mojej perspektywy można rozszerzyć/wdrożyć własną fabrykę stanów. Ale jeśli nastąpi zmiana w samym AbstractState, wszystko odpowiednio się zmieni.

Dzięki!

Odpowiedz

2

CQRS i wzorzec stanu to zupełnie inne rzeczy. Wzorzec stanu zapewnia sposób implementacji zestawu stanów lub statusów dla pojedynczego obiektu, podczas gdy CQRS jest stylem architektonicznym. MVC nie ma nic wspólnego ze wzorcem stanów ani CQRS i jest stylem architektonicznym dla warstwy prezentacji. Możesz użyć wzorca stanu w połączeniu z NHibernate, jednak mapowanie będzie nietrywialne i będziesz musiał zaimplementować niestandardowy IUserType, aby odwzorować do odpowiedniej klasy stanu na podstawie pól. RavenDB różni się bardzo od NHibernate, a mapowanie będzie z nim nieco łatwiejsze, ale jest to zupełnie inny system baz danych.

1

CQRS byłoby, gdyby używałeś języka sql do obsługi narzędzia administracyjnego, a RavenDB do przeprowadzania wyszukiwania za pomocą interfejsu użytkownika. Będziesz musiał przesłać dane do RavenDB z Sql w tym fikcyjnym scenariuszu CQRS.