7

Có một tác vụ được kết nối với trạng thái thay đổi của một thực thể. Và tôi khá bối rối khi nghĩ rằng nó có phải là một cách tiếp cận dựa trên sự kiện có liên quan đến một cái gì đó như CQRS hoặc tôi có thể sử dụng một State pattern và để lại tất cả logic bên trong thực thể.Sử dụng mô hình miền được kết hợp với mẫu Nhà nước

Tôi đã tìm thấy một bài báo trong đó cho thấy một mô hình miền (hoặc một phần của nó) có sử dụng một mô hình nhà nước: http://www.prowareness.com/blog/?p=1448

hệ thống đặt hàng là khá gần với mô hình tên miền của tôi. Vì vậy, ví dụ là rất tốt. Nhưng tôi vẫn tự hỏi nếu nó là một thực hành tốt xem xét mô hình MVC và nếu nó có thể thực hiện với RavenDB/NHibernate?

EDIT: Câu hỏi rethought

Hãy làm theo các ví dụ:

Thứ nhất, đây là một thực thể miền gọi 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; } 
    } 
} 

Trong khi AbstractState là:

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

và nhà máy nhà nước giao diện được định nghĩa như thế này:

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

ý nghĩ cuối cùng là đưa phương pháp:

public void AlterState(String stateString) { 
    this.state = stateFactory.GetState(stateString); 
} 
  1. là thiết kế ok? những khuyết điểm và ưu điểm là gì?
  2. Điều gì về khả năng mở rộng? Từ quan điểm của tôi, người ta có thể mở rộng/thực hiện nhà máy riêng của nhà nước. Nhưng nếu có thay đổi trong số AbstractState thì mọi thứ sẽ thay đổi tương ứng.

Cảm ơn!

Trả lời

3

Bạn có thể quan tâm đến Không quốc tịch, một máy trạng thái phân cấp của Nicholas Blumhardt. Đọc này SO answer here của tôi về khả năng của nó. Đây là simple workflow processor example from my blog và hiện tôi đang sử dụng nó với the Pipe and Filter pattern và hoạt động khá độc đáo.

Sửa

Tôi cũng có một thực hiện sử dụng không quốc tịch với RavenDB nếu bạn quan tâm.

+0

Vâng, tôi khá quan tâm))! – lexeme

2

CQRS và mẫu trạng thái hoàn toàn khác nhau. Mẫu trạng thái cung cấp một cách để thực hiện một tập hợp các trạng thái hoặc trạng thái cho một đối tượng duy nhất trong khi CQRS là một kiểu kiến ​​trúc. MVC không liên quan gì đến mẫu trạng thái cũng như CQRS và là một kiểu kiến ​​trúc cho lớp trình bày. Bạn có thể sử dụng mẫu trạng thái kết hợp với NHibernate, tuy nhiên ánh xạ sẽ không nhỏ và bạn sẽ phải triển khai một IUserType tùy chỉnh để ánh xạ tới lớp trạng thái thích hợp dựa trên các trường. RavenDB rất khác với NHibernate và việc lập bản đồ sẽ khá dễ dàng hơn một chút với nó, nhưng nó là một hệ thống cơ sở dữ liệu hoàn toàn khác.

1

CQRS sẽ là nếu bạn đang sử dụng sql để quay lại công cụ quản trị và RavenDB cho giao diện người dùng để chạy tìm kiếm. Bạn sẽ cần phải đẩy dữ liệu đến RavenDB từ Sql trong kịch bản CQRS hư cấu này.

Các vấn đề liên quan