7

साथ शामिल का उपयोग एक इकाई के राज्य को बदलने के साथ जुड़ा हुआ एक काम नहीं है। और मैं काफी सोच संदेह में हूँ कि क्या यह एक घटना आधारित दृष्टिकोण जो CQRS की तरह कुछ शामिल होना चाहिए या मैं एक State pattern का उपयोग करें और संस्थाओं के अंदर सभी तर्क छोड़ सकते हैं। http://www.prowareness.com/blog/?p=1448एक डोमेन मॉडल एक राज्य पैटर्न

आदेश प्रणाली काफी मेरे डोमेन मॉडल के करीब है:

मैं एक लेख जो एक डोमेन मॉडल (या इसे का एक टुकड़ा) से पता चलता है एक राज्य पैटर्न का उपयोग करता है मिल गया है। तो उदाहरण महान है। लेकिन फिर भी मैं सोच रहा हूं कि एमवीसी पैटर्न पर विचार करना एक अच्छा अभ्यास है और यदि RavenDB/NHibernate के साथ कार्यान्वित करना संभव है?

संपादित करें: प्रश्न की पुन: कल्पना

के उदाहरण का अनुसरण करते हैं:

सबसे पहले, यहाँ एक डोमेन इकाई 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; } 
    } 
} 

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 void AlterState(String stateString) { 
    this.state = stateFactory.GetState(stateString); 
} 
  1. डिजाइन ठीक है:

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

    अंतिम सोचा विधि डाल करने के लिए है? विपक्ष और पेशेवर क्या हैं?

  2. एक्स्टेंसिबिलिटी के बारे में क्या? मेरे परिप्रेक्ष्य से कोई अपने राज्य कारखाने को बढ़ा/कार्यान्वित कर सकता है। लेकिन अगर AbstractState में कोई बदलाव है तो तदनुसार सबकुछ बदल जाता है।

धन्यवाद!

उत्तर

3

आप शायद स्टेटलेस, एक पदानुक्रमित राज्य मशीन निकोलस Blumhardt द्वारा में रुचि। इसे अपनी क्षमता के बारे में SO answer here पढ़ें। यहां एक simple workflow processor example from my blog है, और मैं वर्तमान में इसे the Pipe and Filter pattern के साथ उपयोग करता हूं, और यह काफी अच्छी तरह से काम करता है।

संपादित

मैं भी एक कार्यान्वयन RavenDB साथ स्टेटलेस का उपयोग करता है अगर आप रुचि रखते हैं की है।

+0

हाँ, मुझे काफी दिलचस्पी है))! – lexeme

2

CQRS और राज्य पैटर्न पूरी तरह से अलग बातें हैं। राज्य पैटर्न एक ही वस्तु के लिए राज्यों या स्थितियों के एक समूह को लागू करने का एक तरीका प्रदान करता है जबकि सीक्यूआरएस एक वास्तुशिल्प शैली है। एमवीसी के पास राज्य पैटर्न और न ही सीक्यूआरएस के साथ कुछ लेना देना नहीं है और प्रस्तुति परत के लिए एक वास्तुशिल्प शैली है। आप NHibernate के साथ संयोजन के रूप में राज्य पैटर्न का उपयोग कर सकते हैं, फिर भी मानचित्रण गैर तुच्छ हो जाएगा और आप क्षेत्रों के आधार पर उपयुक्त राज्य वर्ग को मैप करने के लिए एक कस्टम IUserType लागू करना होगा। RavenDB NHibernate से बहुत अलग है और मैपिंग इसके साथ काफी आसान होगा, लेकिन यह एक पूरी तरह से अलग डेटाबेस सिस्टम है।

1

CQRS यदि आप एसक्यूएल उपयोग कर रहे थे एक व्यवस्थापक उपकरण वापस करने के लिए, और RavenDB सामने अंत के लिए खोजों को चलाने के लिए किया जाएगा। आपको इस काल्पनिक सीक्यूआरएस परिदृश्य में एसक्यूएल से डेटा को RavenDB पर धक्का देना होगा।

संबंधित मुद्दे