Использование модели предметной области, объединенной с шаблоном состояния

Есть задача, связанная с изменением состояния сущности . И я совершенно запутался, думая, должен ли это быть подход, основанный на событиях -, который включает что-то вроде 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);
}
  1. Дизайн в порядке? какие минусы и плюсы?
  2. Что насчет расширяемости? С моей точки зрения, можно расширить/внедрить собственную фабрику состояний. Но если есть изменение в самом AbstractState, все меняется соответственно.

Спасибо!

7
задан lexeme 27 August 2012 в 08:18
поделиться