2010-11-17 5 views
8

कहें कि मेरे पास एक नियंत्रक है जो उपयोगकर्ताओं की एक सूची देता है। यदि कैश कुंजी मौजूद है, तो उपयोगकर्ताओं को memcache से वापस किया जाना है, अन्यथा mysql db दबाएं। यह तर्क फिर से वेब सेवा परत या कुछ कहने में उपयोग किया जाएगा।रेल में, क्या हम एक नियंत्रक में तर्क को झुकाव के बजाय, एक सेवा परत नहीं बनाना चाहिए?

कार्रवाई:

def list 

    if in cache 
    @userlist = ... 
    else 
    @userlist = User.all() 
    end 

end 

जावा दुनिया में, आप एक UserService परत है कि अतिरिक्त तर्क लपेट (पहले कैश परत, आदि की जाँच की तरह) करेगे।

रेल में यह लोग इस तर्क को नियंत्रक में डाल देते हैं।

रेल की सर्वश्रेष्ठ अभ्यास क्या है?

+4

आपको कुछ जवाब – Jimmy

उत्तर

9

"रेल मार्ग" है: पतला नियंत्रक, वसा मॉडल।

class User < ActiveRecord::Base 
    def self.all 
    @cached[:all] ||= super 
    end 
end 

या जिस तरह से आप एक से अधिक मॉडल के लिए चाहते हैं एक इंजेक्टर कैश समर्थन करने के लिए बनाने के लिए::

आप बस मॉडल कैश समर्थन करने के लिए बदल सकते हैं

class User < ActiveRecord::Base 
    include CacheInjector 
end 

याद रखें: एक गतिशील के रूप में रूबी, भाषा, विस्तार करना बहुत आसान है। मिक्सिन, इंटरसेप्टर, पहलू, उन सभी चीजें जो जावा में लागू करने के लिए पिटा हैं, रूबी पर बहुत ही आसान और प्राकृतिक हैं। कोशिश करो।

2

मॉडल में उस जांच को क्यों न करें और बस अपने नियंत्रक से मॉडल फ़ंक्शन को कॉल करें। फैट मॉडल और पतला नियंत्रक

+0

स्वीकार करना चाहिए क्योंकि अगर हम ऐसा करते हैं, तो हम सॉलिड में पहले ओओपी सिद्धांतों के खिलाफ: एसआरपी। –

15

कुछ परियोजनाओं/अनुप्रयोगों में सेवा परत स्थापित करने के लिए रेल समुदाय में एक "छोटा" आंदोलन प्रतीत होता है। 2010 में, मैंने एक परियोजना पर काम किया जहां हमने सेवा वस्तुओं को स्टोर करने के लिए एक ऐप्स/सेवाएं निर्देशिका शुरू की। हमने पाया कि एप्लिकेशन तर्क नियंत्रकों और मॉडलों में फैल गया था और इससे इस तरह के व्यवहार को समाहित करने में मदद मिली। जेम्स गोलिक इस विषय पर एक दिलचस्प पोस्ट है। साथ ही पैट मैडॉक्स की टिप्पणी की जाँच करें:

http://jamesgolick.com/2010/3/14/crazy-heretical-and-awesome-the-way-i-write-rails-apps.html

4

अब दिन देखने का अधिक अंक, उदाहरण के इस विषय पर देखते हैं:

http://blog.carbonfive.com/2012/01/10/does-my-rails-app-need-a-service-layer/

http://rubysource.com/ddd-for-rails-developers-part-1-layered-architecture/

मेरे डिफ़ॉल्ट सलाह करने के लिए है ओओपी सिद्धांतों का पालन करें, चीजों को सरल रखें, एसआरपी का उल्लंघन न करें और सार्थक अमूर्तताएं न बनाएं।

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