मैं ऐसा करने का सबसे साफ तरीका जानने का प्रयास कर रहा हूं।बिजनेस ऑब्जेक्ट में डेटा एक्सेस लेयर के लिए सर्वश्रेष्ठ "पैटर्न"
public class Customer
{
public int Id {get;set;}
public string name {get;set;}
public List<Email> emailCollection {get;set}
public Customer(int id)
{
this.emailCollection = getEmails(id);
}
}
तब मेरे ईमेल वस्तु भी सुंदर बुनियादी है:
वर्तमान में मैं एक ग्राहक वस्तु है।
public class Email
{
private int index;
public string emailAddress{get;set;}
public int emailType{get;set;}
public Email(...){...}
public static List<Email> getEmails(int id)
{
return DataAccessLayer.getCustomerEmailsByID(id);
}
}
DataAccessLayer वर्तमान डेटा बेस से जोड़ता है, और परिणाम सेट से अधिक पुनरावृति करने के लिए एक SqlDataReader का उपयोग करता है और नए ईमेल वस्तुओं बनाता है और उन्हें एक सूची है जो इसे लौटाता है जब किया करने के लिए कहते हैं।
तो मैं इस पर कहां और कैसे सुधार कर सकता हूं?
क्या मेरे पास डेटाएक्सेलेयर है, इसके बजाय मुझे डेटाटेबल लौटाएं और ईमेल ऑब्जेक्ट पर इसे पार्स करने के लिए छोड़ दें और एक सूची वापस ग्राहक को वापस कर दें?
मुझे लगता है कि "फैक्टरी" शायद गलत शब्द है, लेकिन क्या मेरे पास एक और प्रकार का ईमेलफैक्टरी होना चाहिए जो डेटाएक्सेलेयर से डेटाटेबल लेता है और ईमेल ऑब्जेक्ट में एक सूची देता है? मुझे लगता है कि इस तरह की आवाज़ अनावश्यक ...
क्या यह मेरे ईमेल.getEmails (id) को स्थिर विधि के रूप में रखने का भी उचित अभ्यास है?
मैं सामान्य रूप से एक साधारण कार्य के लिए सर्वोत्तम "पैटर्न" खोजने और लागू करने की कोशिश करके खुद को फेंक सकता हूं।
धन्यवाद।
अनुवर्ती
मैं एक काम उदाहरण है जहाँ मेरे डोमेन/व्यापार वस्तु एक मौजूदा डेटाबेस से आईडी के आधार पर एक ग्राहक रिकॉर्ड अर्क बनाया। निबर्ननेट में एक्सएमएल मैपिंग फाइलें वास्तव में साफ हैं। सत्र और रिपोजिटरी कारखानों को स्थापित करने के लिए मैंने एक ट्यूटोरियल का पालन करने के बाद, डेटाबेस रिकॉर्ड खींचना काफी सीधे आगे था।
हालांकि, मैंने एक बड़ा प्रदर्शन हिट देखा है।
मेरी मूल विधि में डीबी पर एक संग्रहित प्रक्रिया शामिल थी, जिसे एक डीएएल ऑब्जेक्ट द्वारा बुलाया गया था, जिसने परिणाम को मेरे डोमेन/व्यावसायिक ऑब्जेक्ट में सेट किया था।
मैंने एक एकल ग्राहक रिकॉर्ड प्राप्त करने के लिए 30ms लेने में अपनी मूल विधि देखी। फिर मैंने एक ही रिकॉर्ड को पकड़ने के लिए 3000ms लेने में निहिरनेट विधि देखी।
क्या मुझे कुछ याद आ रही है? या क्या इस निबर्ननेट मार्ग का उपयोग करके बहुत अधिक ओवरहेड है?
अन्यथा मैं कोड की सफाई की तरह:
protected void Page_Load(object sender, EventArgs e)
{
ICustomerRepository repository = new CustomerRepository();
Customer customer = repository.GetById(id);
}
public class CustomerRepository : ICustomerRepository
{
public Customer GetById(string Id)
{
using (ISession session = NHibernateHelper.OpenSession())
{
Customer customer = session
.CreateCriteria(typeof(Customer))
.Add(Restrictions.Eq("ID", Id))
.UniqueResult<Customer>();
return customer;
}
}
}
example I followed मेरी मदद करने के लिए सत्र का प्रबंधन है, शायद यही कारण है कि मैं इस भूमि के ऊपर हो रही है एक सहायक वर्ग बनाने की थी?
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
Configuration cfg = new Configuration();
cfg.Configure();
cfg.AddAssembly(typeof(Customer).Assembly);
_sessionFactory = cfg.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
जिस ऐप्लिकेशन पर मैं काम कर रहा हूं, उसमें गति सार है। और अंततः वेब-ऐप और डेटाबेस के बीच बहुत सारे डेटा गुजरेंगे। यदि यह 3 सेकंड के विपरीत ग्राहक रिकॉर्ड खींचने के लिए एक दूसरे के 1/3 एजेंट लेता है, तो यह एक बड़ी हिट होगी।लेकिन अगर मैं कुछ अजीब कर रहा हूं और यह एक बार प्रारंभिक सेटअप लागत है, तो यह प्रदर्शन योग्य होगा यदि प्रदर्शन डीबी पर संग्रहीत प्रक्रियाओं को निष्पादित करने के समान ही अच्छा था।
अभी भी सुझावों के लिए खुला है!
अपडेट किया गया।
मैं अपना ओआरएम/एनएचबीरनेट मार्ग स्क्रैप कर रहा हूं। मैंने पाया कि प्रदर्शन इसका उपयोग करने के लिए उचित है। बुनियादी ग्राहक प्रश्न हमारे पर्यावरण के लिए बहुत अधिक समय लेते हैं। उप-सेकंड प्रतिक्रियाओं की तुलना में 3 सेकंड बहुत अधिक है।
अगर हम धीमी क्वेरी चाहते थे, तो हम केवल हमारे वर्तमान कार्यान्वयन को बनाए रखेंगे। इसे फिर से लिखने का विचार समय में भारी वृद्धि करना था।
हालांकि, पिछले हफ्ते एनएचबर्ननेट के साथ खेला जाने के बाद, यह एक अच्छा उपकरण है! यह सिर्फ इस परियोजना के लिए मेरी जरूरतों के अनुरूप नहीं है।
बैरी- हाँ यह अभी ठीक काम कर रहा है। केवल एक चीज जिसे मैं सोच सकता हूं वह है कि मेरा DataAccessLayer डेटाटेबल लौटाता है, ताकि मैं डेटा एक्सेस लेयर के बजाय अपने व्यवसाय परत (यानी ईमेल ऑब्जेक्ट) में सत्यापन जांच कर सकूं। –
आपके द्वारा पोस्ट किया गया उदाहरण क्लासिक "एनीमिक डोमेन मॉडल" है। आपके उदाहरण के आधार पर आपको किसी व्यापार वस्तु की भी आवश्यकता नहीं है। एक व्यापार वस्तु को व्यावसायिक तर्क रखना चाहिए, और आपका नहीं है। –