क्या संदर्भ के साथ सीधे काम करना हमेशा अच्छा विचार है? उदाहरण के लिए, कहें कि मेरे पास ग्राहकों का डेटाबेस है और उपयोगकर्ता उन्हें नाम से खोज सकता है, एक सूची प्रदर्शित कर सकता है, एक चुन सकता है, फिर उस ग्राहक की संपत्तियों को संपादित कर सकता है।इकाई फ्रेमवर्क और डब्ल्यूपीएफ सर्वोत्तम प्रथाओं
ऐसा लगता है कि मुझे ग्राहकों की सूची प्राप्त करने के लिए संदर्भ का उपयोग करना चाहिए (पीओसीओ या CustomerViewModels
पर मैप किया गया) और फिर संदर्भ को तुरंत बंद करें। फिर, जब उपयोगकर्ता सूची में CustomerViewModels
में से एक का चयन करता है तो यूआई के ग्राहक गुण अनुभाग पॉप्युलेट हो जाते हैं।
अगला वे एक बटन को बचाने मार करने पर नाम, प्रकार, वेबसाइट के पते, कंपनी के आकार, आदि को बदल सकते हैं, मैं तो एक नया संदर्भ खोलते हैं, तो CustomerViewModel
से आईडी का उपयोग है कि ग्राहक रिकॉर्ड को पुनः प्राप्त करने, और से प्रत्येक को अद्यतन इसकी गुण अंत में, मैं SaveChanges()
पर कॉल करता हूं और संदर्भ बंद करता हूं। यह काम का एक बहुत है।
मेरा सवाल यह है कि पूरे संदर्भ में सीधे संदर्भ के साथ सीधे काम क्यों न करें? मैंने लंबे जीवनकाल के दायरे के साथ एक ही संदर्भ का उपयोग करके पढ़ा है बहुत बुरा है और अनिवार्य रूप से समस्याएं पैदा करेगा। मेरी धारणा यह है कि यदि एप्लिकेशन का उपयोग केवल एक व्यक्ति द्वारा किया जाएगा, तो मैं संदर्भ को खुला छोड़ सकता हूं और सबकुछ कर सकता हूं। हालांकि, यदि कई उपयोगकर्ता होंगे, तो मैं काम की एक संक्षिप्त इकाई को बनाए रखना चाहता हूं और इस प्रकार संदर्भ के आधार पर संदर्भ को खोल और बंद कर दूंगा।
कोई सुझाव? धन्यवाद।
@PGallagher - पूरी तरह से उत्तर के लिए धन्यवाद।
@ ब्रिस - आपका इनपुट उपयोगी है
हालांकि, @Manos डी 'अनावश्यक कोड' का प्रतीक मुझे टिप्पणी करता है। मुझे एक उदाहरण के माध्यम से जाने दो। आइए कहें कि मैं डेटाबेस में ग्राहकों को संग्रहीत कर रहा हूं और मेरे ग्राहक गुणों में से एक CommunicationMethod है।
[Flags]
public enum CommunicationMethod
{
None = 0,
Print = 1,
Email = 2,
Fax = 4
}
यूआई WPF में मेरे प्रबंधन ग्राहकों पेज के लिए ग्राहक संचार पद्धति (प्रिंट, ईमेल, फैक्स) के तहत तीन चेक बॉक्स शामिल होंगे। मैं उस एनम पर प्रत्येक चेकबॉक्स को बाध्य नहीं कर सकता, यह समझ में नहीं आता है। इसके अलावा, यदि उपयोगकर्ता उस ग्राहक पर क्लिक करता है, तो उठता है और दोपहर के भोजन के लिए जाता है ... संदर्भ घंटों के लिए वहां बैठता है जो खराब है। इसके बजाय, यह मेरी विचार प्रक्रिया है।
अंतिम उपयोगकर्ता सूची से ग्राहक को चुनता है। मैं एक संदर्भ को नया करता हूं, उस ग्राहक को ढूंढता हूं और एक ग्राहक व्यू मॉडेल लौटाता हूं, फिर संदर्भ बंद हो जाता है (मैंने यहां सादगी के लिए भंडार छोड़ दिया है)।
using(MyContext ctx = new MyContext())
{
CurrentCustomerVM = new CustomerViewModel(ctx.Customers.Find(customerId));
}
अब उपयोगकर्ता जाँच/प्रिंट, ईमेल, फैक्स बटन सही का निशान के रूप में वे CustomerViewModel है, जो भी एक सहेजें() विधि है में तीन bool गुण के लिए बाध्य कर रहे हैं कर सकते हैं। यहाँ जाता हैं।
public class CustomerViewModel : ViewModelBase
{
Customer _customer;
public CustomerViewModel(Customer customer)
{
_customer = customer;
}
public bool CommunicateViaEmail
{
get { return _customer.CommunicationMethod.HasFlag(CommunicationMethod.Email); }
set
{
if (value == _customer.CommunicationMethod.HasFlag(CommunicationMethod.Email)) return;
if (value)
_customer.CommunicationMethod |= CommunicationMethod.Email;
else
_customer.CommunicationMethod &= ~CommunicationMethod.Email;
}
}
public bool CommunicateViaFax
{
get { return _customer.CommunicationMethod.HasFlag(CommunicationMethod.Fax); }
set
{
if (value == _customer.CommunicationMethod.HasFlag(CommunicationMethod.Fax)) return;
if (value)
_customer.CommunicationMethod |= CommunicationMethod.Fax;
else
_customer.CommunicationMethod &= ~CommunicationMethod.Fax;
}
}
public bool CommunicateViaPrint
{
get { return _customer.CommunicateViaPrint.HasFlag(CommunicationMethod.Print); }
set
{
if (value == _customer.CommunicateViaPrint.HasFlag(CommunicationMethod.Print)) return;
if (value)
_customer.CommunicateViaPrint |= CommunicationMethod.Print;
else
_customer.CommunicateViaPrint &= ~CommunicationMethod.Print;
}
}
public void Save()
{
using (MyContext ctx = new MyContext())
{
var toUpdate = ctx.Customers.Find(_customer.Id);
toUpdate.CommunicateViaEmail = _customer.CommunicateViaEmail;
toUpdate.CommunicateViaFax = _customer.CommunicateViaFax;
toUpdate.CommunicateViaPrint = _customer.CommunicateViaPrint;
ctx.SaveChanges();
}
}
}
क्या आप इसके साथ कुछ गलत देखते हैं?
ग्रेट उत्तर। आपके उत्तर के लिए धन्यवाद: ईएफ टीम के सदस्य का जवाब हमेशा मूल्यवान है। – JYL