Есть задача, связанная с изменением состояния сущности . И я совершенно запутался, думая, должен ли это быть подход, основанный на событиях -, который включает что-то вроде CQRS
, или я могу использовать State pattern
и оставить всю логику внутри сущностей.
Я нашел статью, в которой показана модель предметной области (или ее часть ), использующая шаблон состояния :http://www.prowareness.com/blog/?p=1448
. Система заказов довольно близка к моей модели домена. Так что пример отличный. Но все же мне интересно, является ли это хорошей практикой с учетом шаблона MVC и возможно ли реализовать его с помощью RavenDB/NHibernate
?
РЕДАКТИРОВАТЬ :вопрос переосмыслен
Возьмем пример:
Во-первых, вот объект домена с именемIdea
:
[Serializable]
public class Idea : AbstractEntity {
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; }
}
}
Принимая во внимание, что AbstractState
есть:
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; }
}
}
и интерфейс фабрики состояний определяется следующим образом:
public interface IStateFactory {
AbstractState GetState(String state);
}
последняя мысль - поместить метод:
public void AlterState(String stateString) {
this.state = stateFactory.GetState(stateString);
}
AbstractState
, все меняется соответственно.Спасибо!