मेरे लिए रिपोजिटरी पैटर्न आपके डेटा एक्सेस पद्धति के चारों ओर एक पतली रैपर डालने के बारे में है। LINQ से SQL आपके मामले में, लेकिन NHibernate, दूसरों में हाथ से लुढ़का। जो मैंने खुद को पाया है वह एक भंडार-प्रति-तालिका बना रहा है, जिसके लिए यह बेहद सरल है (ब्रूनो सूचियों की तरह और आपके पास पहले से ही है)। चीजों को खोजने और सीआरयूडी संचालन करने के लिए यह ज़िम्मेदार है।
लेकिन फिर मेरे पास एक सेवा स्तर है जो समग्र जड़ों के साथ अधिक सौदों करता है, जैसा कि जोहान्स का उल्लेख है। मेरे पास GetExistingUser (int id) जैसी विधि के साथ उपयोगकर्ता सेवा होगी। यह उपयोगकर्ता को पुनर्प्राप्त करने के लिए आंतरिक रूप से UserRepository.GetById() विधि को कॉल करेगा। यदि आपकी व्यावसायिक प्रक्रिया के लिए GetExistingUser() द्वारा लौटाए गए उपयोगकर्ता वर्ग की आवश्यकता होती है तो उसे हमेशा उपयोगकर्ता की आवश्यकता होती है। IInInRoles() प्रॉपर्टी भरने के लिए, तो बस उपयोगकर्ता सेवा दोनों UserRepository और रोलरिपॉजिटरी पर निर्भर करती है। छद्म कोड में यह कुछ इस तरह दिखाई दे सकता है:
public class UserRep : IUserRepository
{
public UserRep(string connectionStringName)
{
// user the conn when building your datacontext
}
public User GetById(int id)
{
var context = new DataContext(_conString);
// obviously typing this freeform but you get the idea...
var user = // linq stuff
return user;
}
public IQueryable<User> FindAll()
{
var context = // ... same pattern, delayed execution
}
}
व्यक्तिगत तौर पर मैं आंतरिक रूप से scoped भंडार वर्गों होगा:
public class UserService
{
public UserService(IUserRepository userRep, IRoleRepository roleRep) {...}
public User GetById(int id)
{
User user = _userService.GetById(id);
user.Roles = _roleService.FindByUser(id);
return user;
}
userRep और roleRep एसक्यूएल करने के लिए अपने LINQ का निर्माण किया जाएगा कुछ इस तरह बिट्स और उपयोगकर्ता सेवा और अन्य XXXXX सेवा कक्षाएं सार्वजनिक हैं इसलिए अपने उपभोक्ताओं को सेवा API के ईमानदार रखें। तो फिर मैं रिपॉजिटरीज़ को डेटास्टोर से बात करने के कार्य से अधिक निकटता से जोड़ता हूं, लेकिन आपकी सेवा परत आपकी व्यावसायिक प्रक्रिया की आवश्यकताओं के अनुरूप अधिक निकटता से जुड़ी हुई है।
मैं अक्सर पाया है अपने आप को वास्तव में वस्तुओं के लिए LINQ के लचीलेपन और सभी सामान overthinking और का उपयोग कर IQuerable एट अल बजाय सिर्फ निर्माण सेवा तरीकों कि थूक से बाहर मैं वास्तव में क्या जरूरत है की।उपयोगकर्ता LINQ जहां उपयुक्त है लेकिन सशस्त्र बनाने के लिए सब कुछ करने की कोशिश मत करो।
public IList<User> ActiveUsersInRole(Role role)
{
var users = _userRep.FindAll(); // IQueryable<User>() - delayed execution;
var activeUsersInRole = from users u where u.IsActive = true && u.Role.Contains(role);
// I can't remember any linq and i'm type pseudocode, but
// again the point is that the service is presenting a simple
// interface and delegating responsibility to
// the repository with it's simple methods.
return activeUsersInRole;
}
तो, यह थोड़ा सा जुआ था। निश्चित नहीं है कि मैंने वास्तव में किसी की मदद की है, लेकिन मेरी सलाह है कि एक्सटेंशन विधियों के साथ बहुत फैंसी होने से बचें, और प्रत्येक चलती भागों को बहुत सरल रखने के लिए बस एक और परत जोड़ें। मेरे लिये कार्य करता है।
वैसे आप वहां जाते हैं। हर दिन कुछ सीखो। मुझे अपना दृष्टिकोण समायोजित करने की आवश्यकता होगी :-) – Dylan
हाँ। मैं इस जवाब के साथ कुछ भी सीखता हूं। मुझे पता था कि कई रिपॉजिटरीज़ होने के लिए तार्किक था लेकिन यह नहीं पता था कि प्रत्येक भंडार को समेकन के आसपास बनाया जाना चाहिए। कुल समझ में आता है। –
उत्कृष्ट पोस्ट। –